Effective Javaを読むチャレンジ-項目30 その4-

戦略enumパターン

随分長いことこの項目やってましたが、今回でようやく読み終わりそうです・・・。

定数固有メソッド実装は定数それぞれに異なる振る舞いを持たせることができました。しかし、不利な点もあります。それは、enum定数間でコード共有させることを困難にしていることです。

その困難さを示すサンプルが本書の給与計算のサンプルコードです。サンプルでは定数固有メソッド実装は使わず、代わりにswitch(this)を使った自身のenum定数による分岐でコードの共有を行っています。

しかし、このコードには問題があります。それは、例えば休暇を表すような定数を追加した場合、payメソッドに追加した定数用の実装をし忘れたとしても、コンパイルが通ってしまい、実行されることです。その場合、休暇用の特別な給与計算は行われず、平日と同じ給与が労働者に支払われることになります。

こういった問題を起こさないためには、どうすればいいでしょうか。

定数固有メソッド実装では、enumに定義した抽象メソッドをすべてのenum定数が定数固有クラス本体で実装しなければなりませんでした。上記のように一部の定数は全く同じ処理でいいという場合でも、同じコードを何度も書く必要があります。仮に同じ処理をヘルパーメソッドにして呼び出すようにしても、それなりの量の同じ呼び出しコードが必要になります。

この問題を解決する方法は、この残業手当を計算する戦略を強制的に選択させることです。そのために使うのが戦略enumパターンということですね。こういったサンプルコードになります。

本書をここまで読んでいる人はこのサンプルがすんなり理解できると思います。項目21に出てくる戦略パターンをenumに適用したのが戦略enumパターンでして、PayType enumが戦略インタフェース、WEEKDAYとWEEKEND定数が具象戦略となります。実際にクライアントから呼び出される関数はPayrollDay enumのpayメソッドですね。PayrollDay enumの各定数は戦略enum型と呼ばれているPayType enumの定数、つまり戦略を選択してPayrollDay enumのコンストラクタに渡しています。

このパターンであれば、例え休暇の定数を追加しようとしても、戦略の選択が強制されるようになります。適切な戦略がないときには、戦略enumに戦略を実装する定数を追加すればいいわけです。

といった感じでenumとアノテーションの章の最初の項目が読み終わりました。

広告
  • LINEで送る