11月10日(火)1、2コマ目
今日の予習
前回に引き続き、具象クラス名を書かずにインスタンス生成を行うテクニックの続きです。
前回の動的インスタンス生成は「実際にはあまり使われない、存在だけ知っておいてください」でしたが、今日のネタは現実的なテクニックです。
テクニック その2「enum」
enumとは列挙型のこと。通常は定数をひとまとめしたいときに使われる。
が、メソッドを実装することもできる。
〇列挙定数で標準体重を計算する(Ver.1)
標準体重の計算方法名を列挙定数にして、計算用メソッド(execute())と計算方法名取得用メソッド(toString())を用意。
各メソッドでは、どの列挙定数かで処理を条件分岐。
結局、ここに条件分岐が移ってきただけ。
〇列挙型の計算部分の条件分岐を駆逐する(Ver.2)
Javaの列挙型はEnumクラス継承クラス。
よって、フィールドやメソッドも作れる。
そこで、
標準体重計算を抽象メソッドにする
列挙定数別に標準体重計算メソッド(抽象メソッド)を実装する
とすれば、計算部分の条件分岐がなくなるはず。
ただし、列挙定数別に標準体重計算メソッド(抽象メソッド)を実装するにはサブクラスを作成する必要がある。
が、ここは匿名クラスで簡単に実装することにする。
〇列挙型のtoString()メソッド内の条件分岐を駆逐する(Ver.3)
toString()にも条件分岐が残っている。
解決策として、
計算方法名をセットするフィールドを用意
フィールドには各列挙定数のインスタンス生成時に計算方法名をセットする
toString()はこのフィールドの値を返すだけ
でいきます。
今日のホワイトボード
古典的な列挙型(enum)の使い方
定数のセット集としてつかう。
|
|
図 古典的な列挙型 |
実はenumはクラス
Javaの列挙型はjava.lang.Enumクラスを継承したクラスになる。
|
|
図 列挙型はjava.lang.Enum継承クラス |
ポイントは列挙定数が
- クラス変数であること
- Enum継承クラス(列挙型クラス)のインスタンスを参照すること
です。
標準体重計算では
計算方法毎にサブクラスを作成したが、これらのインスタンス生成時に具象クラス名(BMIクラス、Rohrerクラス、Easyクラス)を指定しなければいけないことが問題(条件分岐が必要)でした。
が、列挙型に各計算方法の列挙定数を用意し、それぞれ計算を行うインスタンスを参照するようにすればいけそうです。
|
|
図 標準体重計算に列挙型を導入 |
計算を行うインスタンス?(匿名クラスの導入)
計算方法毎に別々の計算をさせるには、下図のクラス図のように列挙型クラスを継承したクラスを作る必要があります。
|
|
図 列挙定数が参照するインスタンスは列挙型クラスを継承したクラス |
が、このサブクラスにはせいぜい標準体重を計算するメソッドが必要なだけです。この計算式も1行程度です。わざわざクラスを作るのもあほらしい感じがします。
そこで、匿名クラスです。
計算方法名は?(匿名クラスを引数ありコンストラクタでインスタンス生成)
計算方法名は文字列データです。String型のフィールドにセットすれば行けそうです。
列挙型にフィールドが作れるか?=>所詮クラスです。問題なしです。
いつ、計算方法名フィールドに計算方法名をセットする?=>コンストラクタがいいかと。
でも、各計算方法クラスは匿名クラスで実装したけど引数ありコンストラクタって?
|
|
図 計算方法名はフィールドにセット、コンストラクタで初期化する |
列挙型から各計算方法のインスタンスを取得する
列挙定数は各計算方法に特化したインスタンス(匿名クラスで実装した)を参照しています。
列挙定数が参照するインスタンスを取得すれば、標準体重の計算、計算方法名の取得ができます。
以下が列挙定数が参照するインスタンスを取得するコードです。
EnumクラスのvalueOf()メソッド(クラスメソッド)に列挙定数と同じ文字列を渡せば、列挙定数が参照するインスタンスが取得できます。
四則演算アプリ
列挙型を使って四則演算するアプリケーションを作成しました。ポイントになるクラスだけ紹介しておきます。
〇CalcuratorEnum.java
〇Service.java
ここで、列挙定数が参照するインスタンスを取得する。
〇Index.jsp
演算子を選択するselectリストの戻り値(value属性)は列挙定数と同じ文字列にすること。





コメント