enumも使いまくることにしました

5.0からC/C++でおなじみ列挙型が導入されているわけですが、Javaらしく、いわゆるタイプセーフな列挙型なわけです。
で、ちょっと面白いのが、Javaenumは実態が定数オブジェクトなのでこんなことができます。

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の嵐から抜け出ることができます。