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