2

我有一个List<ParentObject>whereParentObject定义为:

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

用番石榴做到这一点的最简单方法是

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

(披露:我为 Guava 做出了贡献。)

于 2012-04-05T15:05:12.193 回答
2

扩展 AbstractList,而不是实现 List。如果它是不可修改的,那么您需要实现的只是size()and get(int index),这很简单。

AbstractList通过 throw 实现其余部分UnsupportedOperationExceptions

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

于 2012-04-05T15:04:56.443 回答
1

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

于 2012-04-05T15:05:10.027 回答