enumも使いまくることにしました
5.0からC/C++でおなじみ列挙型が導入されているわけですが、Javaらしく、いわゆるタイプセーフな列挙型なわけです。
で、ちょっと面白いのが、Javaのenumは実態が定数オブジェクトなのでこんなことができます。
public enum TypeEnum { TYPE_STRING(String.class), TYPE_BOOLEAN(Boolean.class); public static TypeEnum get(Class<?> klass) { TypeEnum value = null; TypeEnum[] enums = values(); for (int i = 0; i < enums.length; i++) { if (enums[i].type != klass) continue; value = enums[i]; break; } return value; } private Class<?> type; private TypeEnum(Class<?> type) { this.type = type; } public Object getValue(ResultSet rs, String columnName) throws SQLException { Object value = null; switch (this) { case TYPE_STRING: value = rs.getString(columnName); break; case TYPE_BYTE: value = rs.getBytes(columnName); break; } return value; } }
んで、使う側からは、
TypeEnum.get(String.class).getValue(rs, "hoge");
なんてこともできるわけです。これがenumか?といわれるとアレですが。
もちろん、
Object foo = "Foo!"; switch(TypeEnum.get(foo)) { case TYPE_STRING: // なんか処理するよ。 break; case TYPE_BOOLEAN: // やっぱり、なんか処理するよ。 break; default: // んでもって、なんか処理するねん。 break; }
という感じにもできるわけで。うまく使えば、if..elseの嵐から抜け出ることができます。