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-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をロードして初期化する空間と時間のコストぐらい)
・固定数の定数が必要な場合には常に使用すべき