effective java 輪読会 第2章 項目1,2,3,4
DESCRIPTION
TRANSCRIPT
![Page 1: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/1.jpg)
Effective Java 輪読会
2013/11/27開発部 田中
![Page 2: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/2.jpg)
第2章 オブジェクトの生成と消滅(前半)
![Page 3: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/3.jpg)
• 項目1– コンストラクタの代わりに static ファクトリー
メソッドを検討する
![Page 4: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/4.jpg)
メリット
![Page 5: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/5.jpg)
名前を付けられる• 可読性の向上– クラスから生成されるインスタンスが特殊な
場合Ex. BigInteger.probablePrime
– 同じシグニチャを持つ複数のコンストラクタを定義する場合
![Page 6: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/6.jpg)
インスタンスの生成は強制でない
• static フィールドを返すEx. Boolean.valueOf(boolean)
• 「シングルトン」、「インスタンス化不可能」であることを保証できる
Cf. 「インスタンス制御」されている → 項目3、項目4、項目15
![Page 7: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/7.jpg)
サブタイプのオブジェクトを返せる
• ユーティリティクラスに、戻り値がインターフェースであるメソッドを定義する– 実際の戻り値のクラスを Public で定義する必
要がなくなる(実装クラスを隠蔽)
![Page 8: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/8.jpg)
型パラメータの冗長さを低減
Map<String, List<String>> map = new HashMap<String, List<String>>();
public static <K, V> HashMap<K, V> newInstance() { return new HashMap<K, V>();}
Map<String, List<String>> map = HashMap.newInstance();
![Page 9: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/9.jpg)
デメリット
![Page 10: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/10.jpg)
サブクラスを作れない(?)• 意図してインスタンス化不可能にする– コンストラクタを private にする
![Page 11: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/11.jpg)
他の static メソッドと区別がつかない
• 命名規約で回避• valueOf()• getInstance()• newInstance()
![Page 12: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/12.jpg)
まとめ• インスタンス化の方法として、状況に応じ
て static ファクトリーメソッドを用いるべきである
![Page 13: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/13.jpg)
• 項目2– 数多くのコンストラクタパラメータに直面し
た時にはビルダーを検討する
![Page 14: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/14.jpg)
テレスコーピングコンストラクタ
• 必須フィールドとオプションフィールド– 必須フィールドのコンストラクタに、オプ
ションフィールドのコンストラクタを1つずつ追加する
→ 使いづらく、読みにくい
![Page 15: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/15.jpg)
JavaBeans
• パラメータなしのコンストラクタで初期化した後、セッターでフィールドに値をセットしていく
→ 不整合な状態になるかもしれない→ final フィールドにできない
![Page 16: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/16.jpg)
ビルダー
• build() で目的のクラスのインスタンスを生成
• 目的のクラスのフィールドは全てに final属性を付与できる
• 読みやすい(宣言的?)
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8). calories(100).sodium(35).build();
![Page 17: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/17.jpg)
まとめ• 多くのパラメータを持つクラスの初期化
方法としてビルダーパターンは有効である• ただし、ビルダーを生成するコストが問
題になる可能性がある
![Page 18: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/18.jpg)
• 項目3– private のコンストラクタか enum 型でシング
ルトン特性を強制する
![Page 19: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/19.jpg)
クラスをシングルトンにする方法
![Page 20: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/20.jpg)
public final フィールド
• コンストラクタを private にすることで、オブジェクトの生成を 1 回のみに強制する
public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... }
...}
![Page 21: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/21.jpg)
static ファクトリーメソッド
• インスタンスは private static final フィールドで一度のみ初期化
• ファクトリーメソッドで参照するINSTANCE は常に同一インスタンス
public class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis(); public static Elvis getInstance() { return INSTANCE; }
...}
![Page 22: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/22.jpg)
単一要素の enum 型public enum Elvis { INSTANCE;
...}
![Page 23: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/23.jpg)
• 項目4– private のコンストラクタでインスタンス化不
可能を強制する
![Page 24: Effective java 輪読会 第2章 項目1,2,3,4](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a364ab47959654d8b589e/html5/thumbnails/24.jpg)
private コンストラクタ
• デフォルトコンストラクタを抑制• サブクラス化も不可能
public class UtilityClass {
private UtilityClass() { throw new AssertionError(); }
...}