我可以在不复制的情况下包装List对象吗?

时间:2017-07-18 19:22:05

标签: java list extends

我有一个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>>是由外部来源提供的。

2 个答案:

答案 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