Hatena::ブログ(Diary)

あさとの @drillbits このページをアンテナに追加 RSSフィード

2010/05/14

フィールドに代入されてるインスタンスにフィールド名を文字列としてセットしようとした

public class Foo {
  String id;

  public void setId(String id) {
    this.id = id;
  }
}

みたいなクラス Foo があって、Foo のインスタンスを複数保持する Bar が

public class Bar {
  Foo foo1;
  Foo foo2;
  Foo foo3;

  public Bar() {
    foo1 = new Foo();
    foo1.setId("foo1");

    foo2 = new Foo();
    foo2.setId("foo2");

    foo3 = new Foo();
    foo3.setId("foo3");
  }
}

のように、各 Foo 型のインスタンスにフィールド名と同じ文字列をセットしてるんだ*1

でも、これだとスペルミスで間違った文字列つっこむことがあってめんどくさい!

foo1.setId(foo1.getFieldName());

みたいなことができないかな>< でもそんなメソッドないです><

ということでリフレクションで無理やり実装した

public class Bar {
  Foo foo1;
  Foo foo2;
  Foo foo3;
  
  public Bar() {
    // 宣言されてるフィールドを全部取得
    for (Field f : getClass().getDeclaredFields()) {
      Object o;
      try {
        // インスタンス生成
        o = f.getType().newInstance();
        if (o instanceof Foo) {
          //  Foo 型だったらフィールド名をセット
          ((Foo) o).setId(f.getName());
          f.set(this, o);
        }
      } catch (InstantiationException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
  }
}


うん、余計めんどくさくなった

*1:そもそもその処理自体がどうなんだ

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/drillbits/20100514/set_field_name_to_instance