0

次のように、データベースの内容を表す Java のオブジェクトを取得しました。

public Database {
    int varA;
    String varB;
    double varC;
}

現在、処理のために特定の要素を選択して順序付けようとしていますが、構成可能にしたいので、オブジェクトのすべての属性を表す列挙型を作成しました

public enum Contents {
    VarA,
    VarB,
    VarC;
}

だから今、次のような選択を作成すると

Contents[] select = { Contents.VarC, Contents.VarB };

これから、実際のデータベースの内容を表す文字列値のリストを生成したいと考えています。今私が考えることができる唯一の実装は、選択のエントリごとに切り替えることであり、かなり醜い二次複雑さを持っています...

public List<String> switchIT(Database db, Contents[] select) {
    List<String> results = new ArrayList<String>();

    for (Contents s : select) {
        switch(s) {
            case VarA:
                results.add(db.varA.toString());
                break;
            //go on...
        }
    }

    return results;
}

列挙型と動的オブジェクトの値をマッピングするより直接的な方法はありますか? または、より一般的に言えば、オブジェクトから動的に値を選択する最良の方法は何ですか?

4

1 に答える 1

3

本格的なクラスである Java 列挙型の機能を使用します。

public enum Contents {
  VarA { public String get(Database d) { return d.getVarA(); } },
  VarB { public String get(Database d) { return d.getVarB(); } },
  VarC { public String get(Database d) { return d.getVarC(); } };
  public String get(Database d) { return ""; }
}

クライアントコードは次のようになります

public List<String> switchIT(Database db, Contents[] select) {
  List<String> results = new ArrayList<String>();
  for (Contents s : select) results.add(s.get(db));
  return results;
}

より簡潔で遅い解決策は、getリフレクションに基づく単一の実装を使用し、列挙型メンバーの名前を使用して適切なゲッター名を生成することです。

public enum Contents {      
  VarA, VarB, VarC;

  private final Method getter;

  private Contents() {
    try {
      this.getter = Database.class.getMethod("get"+name());
    } catch (Exception e) { throw new RuntimeException(e); }
  }
  public String get(Database d) {
    try {
      return (String) getter.invoke(d); 
    } catch (Exception e) { throw new RuntimeException(e); }
  }
}
于 2012-10-14T09:23:07.877 に答える