2

List<ParentObject>whereは次のようParentObjectに定義されています。

public class ParentObject
{
  ChildObject child1;
  // and other stuff...
}

ラッパーリストを構築することにより、それを変更不可能List<ParentObject>なものとして他の人に公開したいと思います: List<ChildObject>

public class WrapperList implements List<ChildObject>
{
  List<ParentObject> delegateList;

  public WrapperList( List<ParentObject> delegateList )
  {
    this.delegateList = delegateList;
  }

  // fill in java.util.List methods...
}

私はこのアプローチを採用して機能させることができますが、これは一般的に解決された可能性のある問題のようです。私が提案しているようなリストラッパーを提供する既存のライブラリはありますか? ChildObjectおそらく、指定されたからを取得する方法をラッパー リストに伝える変換メソッドを定義しますParentObject

基本的な質問は次のとおりです:これは良いアプローチですか、それとも既にこのようなものを提供するライブラリ(GuavaまたはApache Commons Collectionsなど)がありますか?

4

3 に答える 3

4

Guava でこれを行う最も簡単な方法は、

return Collections.unmodifiableList(Lists.transform(parentList,
  new Function<ParentObject, ChildObject>() {...}));

(開示:私はGuavaに貢献しています。)

于 2012-04-05T15:05:12.193 に答える
2

List を実装する代わりに、AbstractList を拡張します。変更不可にする場合、実装する必要があるのはsize()とだけget(int index)です。これらは自明です。

AbstractListを投げて残りを実装しUnsupportedOperationExceptionsます。

あなたが求めるものを提供できる一般的なリストは知りませんが、構築するのは複雑ではありません(単に反射するだけです)。

于 2012-04-05T15:04:56.443 に答える
1

Guava と Collections.unmodifiableList を使用してこれを解決できると思います。グアバでは、Lists.transformを使用します

于 2012-04-05T15:05:10.027 に答える