こういうパターンはいかがでしょうか?という内容です。
javaのenumについてです。
先日、ふと、Effective Javaを読み直してenumについての認識を改めました。
enumの変数というのは、「唯一のインスタンス」
その結果、定数のようにイコールの演算子で一致するのです。
以前からそれは理解していました。
が、実は、思ってた以上に普通のクラスと同じで、インターフェースを実装できます。
さらには、mainメソッドを書いて実行することもできるのです。
これを定数としてしか使わないのは勿体無い。
ということで、有効活用をちょっと考えてみた。
- こういうのはいかが?
-
package sample; import java.math.BigDecimal; enum NumberUtility { SIMPLE { @Override Integer createInteger(String x_str) { return Integer.valueOf(x_str); } @Override BigDecimal createBigDecimal(String x_str) { return new BigDecimal(x_str); } }, QUIET { @Override Integer createInteger(String x_str) { Integer result = null; if (x_str != null) { try { result = SIMPLE.createInteger(x_str); } catch (NumberFormatException e) { } } return result; } @Override BigDecimal createBigDecimal(String x_args) { BigDecimal result = null; if (x_args != null) { try { result = SIMPLE.createBigDecimal(x_args); } catch (NumberFormatException e) { } } return result; } }; abstract Integer createInteger(String x_str); abstract BigDecimal createBigDecimal(String x_str); } abstract class Test { void exec() { System.out.println("100 => " + getNumberUtility().createInteger("100")); System.out.println("10.0 => " + getNumberUtility().createBigDecimal("10.0")); System.out.println("null => " + getNumberUtility().createInteger("null")); } abstract NumberUtility getNumberUtility(); } public class TestMain { public static void main(String[] args) { try { new Test() { @Override NumberUtility getNumberUtility() { return NumberUtility.SIMPLE; } }.exec(); } catch (Exception e) { System.out.println("catch exception. => " + e.getMessage()); } System.out.println(); try { new Test() { @Override NumberUtility getNumberUtility() { return NumberUtility.QUIET; } }.exec(); } catch (Exception e) { System.out.println("catch exception. => " + e.getMessage()); } } }
-
enumの中にabstractメソッドがあって、その場で実装しています。こんなことができるんですねぇ。知りませんでした。
書いた内容について簡単に言うと、Utilityクラスの切り替えです。
Utilityの処理の役割としてはstaticなメソッドで実装したいのだけど、ロジックの違いをインスタンスで変えたいって感じです。
Javaの言語仕様での、enumの実現方法がシンプルだからこそ、これだけの自由度があるのでしょう。
単純さが自由になります。