不可修改的列表包装器暴露不同的通用类型

时间:2012-04-05 15:00:02

标签: java generics collections

我有一个List<ParentObject>,其中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或其他东西)已经提供了这样的东西?

3 个答案:

答案 0 :(得分:4)

使用Guava执行此操作的最简单方法是

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

(披露:我向Guava捐款。)

答案 1 :(得分:2)

不是实现List,而是扩展AbstractList。如果它不可修改,那么您需要实现的只有size()get(int index),这些都是微不足道的。

AbstractList通过抛出UnsupportedOperationExceptions来实现其余功能。

我不知道任何可以提供你所要求的通用列表,但构建起来并不复杂(只会反思)。

答案 2 :(得分:1)

我认为您可以使用Guava然后使用Collections.unmodifiableList来解决这个问题。 在番石榴中,使用Lists.transform