我有一个List<List<Object>>
,但我不想总是在我使用它的地方写出来,这也增加了可读性。所以我想把它包装在一个名为ValueSheet
的对象中。
这就是我所做的,但它会产生巨大的开销,因为它创建了List的副本,这是不必要的:
public class ValueSheet extends ArrayList<List<Object>> {
public ValueSheet(List<List<Object>> values) {
super(values);
}
}
是否可以在没有开销的情况下这样做,同时保留此Object为List<List<Object>>
的事实?这意味着我不是在寻找这个:
public class ValueSheet {
List<List<Object>> values;
public ValueSheet(List<List<Object>> values) {
this.values = values;
}
}
PS:不,我无法直接实例化ValueSheet
,因为List<List<Object>>
是由外部来源提供的。
答案 0 :(得分:1)
ArrayList
并非真正用于扩展。
它的父类AbstractList
是为扩展而设计的,
它可能适合您的目的。这是一个最小的例子:
public class ValueSheet extends AbstractList<List<Object>> {
private final List<List<Object>> values;
ValueSheet(List<List<Object>> values) {
this.values = values;
}
@Override
public List<Object> get(int index) {
return values.get(index);
}
@Override
public int size() {
return values.size();
}
}
请注意,调用修改列表的方法将抛出UnsupportedOperationException
。
如果您需要任何这些方法,
你需要自己覆盖并实现它们。
(它可以像委托给基础列表一样简单。)
答案 1 :(得分:0)
为什么必须首先使用复制构造函数创建append
?
尝试重构您的代码以直接使用ValueSheet
,并且永远不会实例化ValueSheet
。