- PR -

BeanのプロパティをIteratorで取得する方法

1
投稿者投稿内容
おかじー
会議室デビュー日: 2003/02/21
投稿数: 10
投稿日時: 2004-05-16 19:37
BeanのプロパティをIteratorで取得したいのです。
下に例をあげます。
コード:
public class Car {
  private String name = "ベ○ツ";
  private String color = "黒";
  //アクセサメソッドは省略
}

public class Hoge {
  public void hoge(Car car) {
    Iterator carIt = ここで、プロパティをIteratorで取得
    while (carIt.hasNext()) {
      Object obj = (Object) carIt.next();
      System.out.println(obj.toString());
    }
  }
}
結果:
 ベ○ツ
 黒


jakarta-commonsに、使えそうなコンポーネントが無いが探してみました。
collectionsのBeanMapクラスにvalueIteratorメソッドがありましたので、使ってみましたが・・・

コード:
Iterator carIt = new BeanMap(car).valueIterator();
結果:
 class Car
 ベ○ツ
 黒


となります。
どうやら、クラス名まで、Iteratorで返されるようです。

表題のような要求を満たすコードを書くとき、皆さんはどうされてます?
Beanに、Iteratorパターンを実装する・・・という方法も考えられるとは思います。
しかし、jakartaのcollectionsやBeanUtilsには、良いコンポーネントがあるような気がしてならないのですが・・・
そもそも、プロパティをIteratorで・・・なんて考え方がおかしいのか?

最近、コンポーネント化・部品化について、考えるようになってきました。
そんな日々の中で、悩んでいる次第です。

ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 2004-05-16 21:11
Field[] fields = car.getClass().getDeclaredFields();
でCarクラスで定義したフィールド一覧を配列で取得できます。

どうしてもIteratorで取りたければ、
Iterator it = Arrays.asList(fields).iterator();
で配列からListを生成してそのiteratorを取り出すことはできます。

面倒なのは、スーパークラスにあるフィールドも含めたいときです。
ClassクラスのgetSuperclassメソッドで再帰的にスーパークラスを
たどってgetDeclaredFieldsメソッドでフィールドを取得していく
ことになるかと思われます。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-05-17 10:39
java.beansパッケージの
BeanInfoクラスやPropertyDescriptorクラスを使えば、
似たようなことはできますが・・・

# 帰ってくるのがIteratorではなくてPropertyDescriptorの配列だとか、
# 値を取るのにinvokeしなきゃいけないとか、多少面倒ですが。

どうしてもIteratorで欲しいなら、各BeanにgetIteratorってメソッドを実装してしまうのが一番簡単なような
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-17 11:23
こんにちは、Wataです。
引用:

おかじーさんの書き込み (2004-05-16 19:37) より:
jakarta-commonsに、使えそうなコンポーネントが無いが探してみました。
collectionsのBeanMapクラスにvalueIteratorメソッドがありましたので、使ってみましたが・・・
(略)
どうやら、クラス名まで、Iteratorで返されるようです。


これは、Object#getClass()をプロパティとみなしているからでしょう。
classプロパティを含まないIteratorが欲しいのなら以下のようにするのはどうですか?
コード:
Map bMap = new BeanMap(car);
HashMap hMap = new HashMap(bMap);
hMap.remove("class");
Iterator itr = hMap.values().iterator();

1

スキルアップ/キャリアアップ(JOB@IT)