Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save meganetaaan/75e91154ded3de0efa99 to your computer and use it in GitHub Desktop.
Save meganetaaan/75e91154ded3de0efa99 to your computer and use it in GitHub Desktop.

項目30_int定数の代わりにenumを利用する.md

int enumパターンのだめなところ

  • 型安全じゃない
  • 名前空間が使えない
  • クライアントの中にコンパイルされてしまう
  • 文字列に変換しづらい(表示されるのはただのint)
  • イテレートやsize取得ができない

String enumパターン→さらにだめ

  • 文字列定数をハードコードされた日には… ** しかも誤字があったら…!

そこでenum型

  • 型安全!

  • 独自の名前空間!

  • toString!

  • 任意のメソッドやフィールドを追加できる!

メソッドやフィールドが追加できてうれしいこと

  • データと紐付けができる **(例:Planet)質量と半径から表面重力が計算できる→コンストラクタで計算してフィールドに追加

enumにもっと色々させる

定数によって異なる振る舞いをさせる(例:算術演算の種類)

定数でcase→美しくない

  • throw文必須
  • case追加し忘れると、利用する側はコンパイルできるが実行時に例外

そこで定数固有メソッド実装

  • 確定数のコンストラクタ内で抽象メソッドをオーバーライドする
  • typesafe enumパターンを思い出して!
  • toStringをオーバーライドするのも◯
  • さらにfromString

コンストラクタ内ではまだenumのstaticフィールドにアクセスできない(初期化されていない)

定数固有メソッドの欠点→コードの共有がし辛い 定数が7種類あるけど振る舞いは2種類 →メソッドのコードをコピーするか、ヘルパーメソッドへの転送を書く…冗長

平日用の残業代計算の具象メソッドを持たせて、 週末だけそれをオーバーライドする…結局オーバーライド忘れたらだめ。 定数の定義時に残業代計算の方法を強制的に選ばせたい。

そこで戦略enumパターン! ネストしたEnumをprivateで持つ。 それをコンストラクタに渡す。

じゃあswitch文はいつ使えばいいの…

外部のenum型を強化するのに使える (例)

enumの使いどころ

固定数の定数が必要な場合はいつでも使うべき

  • 惑星
  • 週の曜日
  • チェスの駒
  • メニューの選択肢
  • コマンドラインのフラグ コンパイル時にどんな値を取りうるかが全て分かっている場合、とも言える。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment