effective java 輪読会 第2章 項目1,2,3,4

24
Effective Java 輪輪輪 2013/11/27 輪輪輪 輪輪

Upload: appresso-engineering-team

Post on 18-Dec-2014

808 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Effective java 輪読会 第2章 項目1,2,3,4

Effective Java 輪読会

2013/11/27開発部 田中

Page 2: Effective java 輪読会 第2章 項目1,2,3,4

第2章 オブジェクトの生成と消滅(前半)

Page 3: Effective java 輪読会 第2章 項目1,2,3,4

• 項目1– コンストラクタの代わりに static ファクトリー

メソッドを検討する

Page 4: Effective java 輪読会 第2章 項目1,2,3,4

メリット

Page 5: Effective java 輪読会 第2章 項目1,2,3,4

名前を付けられる• 可読性の向上– クラスから生成されるインスタンスが特殊な

場合Ex. BigInteger.probablePrime

– 同じシグニチャを持つ複数のコンストラクタを定義する場合

Page 6: Effective java 輪読会 第2章 項目1,2,3,4

インスタンスの生成は強制でない

• static フィールドを返すEx. Boolean.valueOf(boolean)

• 「シングルトン」、「インスタンス化不可能」であることを保証できる

Cf. 「インスタンス制御」されている → 項目3、項目4、項目15

Page 7: Effective java 輪読会 第2章 項目1,2,3,4

サブタイプのオブジェクトを返せる

• ユーティリティクラスに、戻り値がインターフェースであるメソッドを定義する– 実際の戻り値のクラスを Public で定義する必

要がなくなる(実装クラスを隠蔽)

Page 8: Effective java 輪読会 第2章 項目1,2,3,4

型パラメータの冗長さを低減

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

デメリット

Page 10: Effective java 輪読会 第2章 項目1,2,3,4

サブクラスを作れない(?)• 意図してインスタンス化不可能にする– コンストラクタを private にする

Page 11: Effective java 輪読会 第2章 項目1,2,3,4

他の static メソッドと区別がつかない

• 命名規約で回避• valueOf()• getInstance()• newInstance()

Page 12: Effective java 輪読会 第2章 項目1,2,3,4

まとめ• インスタンス化の方法として、状況に応じ

て static ファクトリーメソッドを用いるべきである

Page 13: Effective java 輪読会 第2章 項目1,2,3,4

• 項目2– 数多くのコンストラクタパラメータに直面し

た時にはビルダーを検討する

Page 14: Effective java 輪読会 第2章 項目1,2,3,4

テレスコーピングコンストラクタ

• 必須フィールドとオプションフィールド– 必須フィールドのコンストラクタに、オプ

ションフィールドのコンストラクタを1つずつ追加する

→  使いづらく、読みにくい

Page 15: Effective java 輪読会 第2章 項目1,2,3,4

JavaBeans

• パラメータなしのコンストラクタで初期化した後、セッターでフィールドに値をセットしていく

→  不整合な状態になるかもしれない→   final フィールドにできない

Page 16: Effective java 輪読会 第2章 項目1,2,3,4

ビルダー

• build() で目的のクラスのインスタンスを生成

• 目的のクラスのフィールドは全てに final属性を付与できる

• 読みやすい(宣言的?)

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

Page 17: Effective java 輪読会 第2章 項目1,2,3,4

まとめ• 多くのパラメータを持つクラスの初期化

方法としてビルダーパターンは有効である• ただし、ビルダーを生成するコストが問

題になる可能性がある

Page 18: Effective java 輪読会 第2章 項目1,2,3,4

• 項目3– private のコンストラクタか enum 型でシング

ルトン特性を強制する

Page 19: Effective java 輪読会 第2章 項目1,2,3,4

クラスをシングルトンにする方法

Page 20: Effective java 輪読会 第2章 項目1,2,3,4

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

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

単一要素の enum 型public enum Elvis { INSTANCE;

...}

Page 23: Effective java 輪読会 第2章 項目1,2,3,4

• 項目4– private のコンストラクタでインスタンス化不

可能を強制する

Page 24: Effective java 輪読会 第2章 項目1,2,3,4

private コンストラクタ

• デフォルトコンストラクタを抑制• サブクラス化も不可能

public class UtilityClass {

private UtilityClass() { throw new AssertionError(); }

...}