Upload
appresso-engineering-team
View
435
Download
2
Embed Size (px)
Citation preview
Effective Java 輪読会
2013/01/23開発部 田中
第 6 章 enumとアノテーション(項目 30 ~ 31 )
• 項目 30– int 定数の代わりに enum を使用する
論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略
enum5. いつ enum を使うか
論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略
enum5. いつ enum を使うか
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 { .., .. }
論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略
enum5. いつ enum を使うか
enum に振る舞いを持たせる• 定数値 → シングルトンオブジェクト• Planet という抽象から、具体的な惑星を表
すシングルトンオブジェクトの集合を生成
• 最適化のためにメソッドを定義– インスタンスフィールドから、必要に応じて
情報を計算できる
論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略
enum5. いつ enum を使うか
定数固有クラス本体• 定数固有メソッド実装– 関数オブジェクト的• 無名クラスの実装を、 static final な変数にバインド
する点で
• ということはストラテジーパターンに使えるかも• もちろんフィールドを持つことも可能
public enum Operation { PLUS { double apply(double x, double y) { return x + y } }, : abstract double apply(double x, double y);}
論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略
enum5. いつ enum を使うか
定数固有メソッドを共通化• 例:賃金計算– 平日 / 休日– 一つの pay メソッドで switch ?
戦略 enum パターン• 戦略 enum 型を内部に定義– 定数のパラメータとして戦略の選択を強制– 戦略 enum 型で各戦略に共通抽象メソッドを
定義しておくことが重要• 平日・休日のどちらも、戦略を通じて overtimePay
を呼び出すため– switch 文を使うよりもミスが減る• 定数を追加した場合• 戦略を追加した場合
論点1. int 定数の代替としての enum は何が強いか2. 振る舞いを持たせる:列挙シングルトン?3. 定数固有の振る舞いを持たせたい4. 振る舞いを定数間で共有させるなら戦略
enum5. いつ enum を使うか
いつ enum を使うべきか• enum によって型を定義する– 互いに関連する値の集合
• 項目 31– 序数の代わりにインスタンスフィールドを使
用する
論点1. ordinal メソッドの使い方に注意
ほとんど使う機会はない• 使う必要があるのは EnumSet や EnumMap
などの、 enum のデータ構造を把握する必要がある場合に限られる