- 型安全じゃない
- 名前空間が使えない
- クライアントの中にコンパイルされてしまう
- 文字列に変換しづらい(表示されるのはただのint)
- イテレートやsize取得ができない
- 文字列定数をハードコードされた日には… ** しかも誤字があったら…!
-
型安全!
-
独自の名前空間!
-
toString!
-
任意のメソッドやフィールドを追加できる!
- データと紐付けができる **(例:Planet)質量と半径から表面重力が計算できる→コンストラクタで計算してフィールドに追加
定数によって異なる振る舞いをさせる(例:算術演算の種類)
定数でcase→美しくない
- throw文必須
- case追加し忘れると、利用する側はコンパイルできるが実行時に例外
そこで定数固有メソッド実装
- 確定数のコンストラクタ内で抽象メソッドをオーバーライドする
- typesafe enumパターンを思い出して!
- toStringをオーバーライドするのも◯
- さらにfromString
コンストラクタ内ではまだenumのstaticフィールドにアクセスできない(初期化されていない)
定数固有メソッドの欠点→コードの共有がし辛い 定数が7種類あるけど振る舞いは2種類 →メソッドのコードをコピーするか、ヘルパーメソッドへの転送を書く…冗長
平日用の残業代計算の具象メソッドを持たせて、 週末だけそれをオーバーライドする…結局オーバーライド忘れたらだめ。 定数の定義時に残業代計算の方法を強制的に選ばせたい。
そこで戦略enumパターン! ネストしたEnumをprivateで持つ。 それをコンストラクタに渡す。
外部のenum型を強化するのに使える (例)
固定数の定数が必要な場合はいつでも使うべき
- 惑星
- 週の曜日
- チェスの駒
- メニューの選択肢
- コマンドラインのフラグ コンパイル時にどんな値を取りうるかが全て分かっている場合、とも言える。