Effective Java 第二版 再読

2-1.コンストラクタの代わりにstaticファクトリーメソッドを検討する

オーバーロードされたコンストラクタが複数→わかりづらい
・× Biginteger(int, int, Random) ○ BigInteger.probablePrimeという名のstaticファクトリーメソッド
インスタンス制御すればオブジェクト生成は一回ですむ
命名規則:newInstance,getInstance,of,valueOf,getType,newTypeなど

2-2.数多くのコンストラクタパラメータに直面した時にはビルダーを検討する

・×パラメータをJavaBeans化した場合、生成過程で不整合が起こりうる
・○staticなBuilder内部クラスを持つ

NutritionFacts.Builder(240, 8).calories(100).sodium(35).build();

2-3.シングルトンはenum

public enum MySingleton {
    INSTANCE,

}

2-4.privateのコンストラクタでインスタンス化不可能を強制する

2-5.不必要なオブジェクトの生成を避ける

・不変オブジェクトはメソッド呼び出しの度に生成せずstatic初期化子で回避できる
・ボクシングされた基本データ型よりもプリミティブ型を選び不必要なオートボクシングを避けること

2-6.廃れたオブジェクト参照を取り除く

・プーリングを実装した時にずっとつかんでるオブジェクトがないか
・キャッシュする場合も同じ→解決策:WeakHashMap
・リスナーやコールバックもメモリリークの原因
ヒーププロファイラMemory Analyzerを使いましょう

2-7.ファイナライザを避ける

6-30.int定数の代わりにenumを使用する

・個々の列挙定数に対して1つのインスタンスを公開しているクラス
・アクセス可能なコンストラクタを持っていないので事実上final→宣言されたenum定数以外のインスタンスは存在しない
・int enumパターンと異なりクライアントのソースコード中にコンパイルされない→enum内変更可能
・データの他に振る舞い(メソッド)も持てる
・クライアントにenumのメソッドを公開するやむを得ない理由がない限り、メソッドはprivateパッケージプライベートにする
・各enum定数に異なる振る舞いを関連付けたい→定数固有メソッド実装

public enum Operation{
    PLUS   {double apply(double x, double y){return x + y;}},
    MINUS {double apply(double x, double y){return x - y;}},
    TIMES  {double apply(double x, double y){return x * y;}},
    DIVIDE {double apply(double x, double y){return x / y;}},

    abstract double apply(double x, double y);
}

・toStringをオーバーライドする

public enum Operation{
    PLUS("+")   {double apply(double x, double y){return x + y;}},
    MINUS("-") {double apply(double x, double y){return x - y;}},
    TIMES("*")  {double apply(double x, double y){return x * y;}},
    DIVIDE("/") {double apply(double x, double y){return x / y;}},
    private final String symbol;
    Operation(String symbol){this.symbol = symbol;}
    @Override public String toString(return symbol);
    abstract double apply(double x, double y);
}

ただしfromStringメソッドも書くこと
Enumのstaticフィールドにアクセスすることは許されていない
戦略enumパターン→ネストしたenum
enumはint定数と比べても遜色ない(enumをロードして初期化する空間と時間のコストぐらい)
・固定数の定数が必要な場合には常に使用すべき