18
Effective Java 輪輪輪 2013/01/23 輪輪輪 輪輪

Effective java 輪読会 第6章 項目30-31

Embed Size (px)

Citation preview

Page 1: Effective java 輪読会 第6章 項目30-31

Effective Java 輪読会

2013/01/23開発部 田中

Page 2: Effective java 輪読会 第6章 項目30-31

第 6 章  enumとアノテーション(項目 30 ~ 31 )

Page 3: Effective java 輪読会 第6章 項目30-31

• 項目 30– int 定数の代わりに enum を使用する

Page 4: Effective java 輪読会 第6章 項目30-31

論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略

enum5. いつ enum を使うか

Page 5: Effective java 輪読会 第6章 項目30-31

論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略

enum5. いつ enum を使うか

Page 6: Effective java 輪読会 第6章 項目30-31

enum はクラス• 名前空間を持ち、型安全である

public static final int APPLE_.. = 0;public static final int APPLE_.. = 1;public static final int ORANGE_.. = 0;public static final int ORANGE_.. = 1;

public enum Apple { .., .. }Public enum Orange { .., .. }

Page 7: Effective java 輪読会 第6章 項目30-31

論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略

enum5. いつ enum を使うか

Page 8: Effective java 輪読会 第6章 項目30-31

enum に振る舞いを持たせる• 定数値 → シングルトンオブジェクト• Planet という抽象から、具体的な惑星を表

すシングルトンオブジェクトの集合を生成

• 最適化のためにメソッドを定義– インスタンスフィールドから、必要に応じて

情報を計算できる

Page 9: Effective java 輪読会 第6章 項目30-31

論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略

enum5. いつ enum を使うか

Page 10: Effective java 輪読会 第6章 項目30-31

定数固有クラス本体• 定数固有メソッド実装– 関数オブジェクト的• 無名クラスの実装を、 static final な変数にバインド

する点で

• ということはストラテジーパターンに使えるかも• もちろんフィールドを持つことも可能

public enum Operation { PLUS { double apply(double x, double y) { return x + y } }, : abstract double apply(double x, double y);}

Page 11: Effective java 輪読会 第6章 項目30-31

論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略

enum5. いつ enum を使うか

Page 12: Effective java 輪読会 第6章 項目30-31

定数固有メソッドを共通化• 例:賃金計算– 平日 / 休日– 一つの pay メソッドで switch ?

Page 13: Effective java 輪読会 第6章 項目30-31

戦略 enum パターン• 戦略 enum 型を内部に定義– 定数のパラメータとして戦略の選択を強制– 戦略 enum 型で各戦略に共通抽象メソッドを

定義しておくことが重要• 平日・休日のどちらも、戦略を通じて overtimePay

を呼び出すため– switch 文を使うよりもミスが減る• 定数を追加した場合• 戦略を追加した場合

Page 14: Effective java 輪読会 第6章 項目30-31

論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略

enum5. いつ enum を使うか

Page 15: Effective java 輪読会 第6章 項目30-31

いつ enum を使うべきか• enum によって型を定義する– 互いに関連する値の集合

Page 16: Effective java 輪読会 第6章 項目30-31

• 項目 31– 序数の代わりにインスタンスフィールドを使

用する

Page 17: Effective java 輪読会 第6章 項目30-31

論点1. ordinal メソッドの使い方に注意

Page 18: Effective java 輪読会 第6章 項目30-31

ほとんど使う機会はない• 使う必要があるのは EnumSet や EnumMap

などの、 enum のデータ構造を把握する必要がある場合に限られる