使用等号或复制构造函数设置列表等于列表?

时间:2011-09-02 12:39:18

标签: java

这是一个简单的问题,但如果我这样做

List<Object> list = getObjectsFromDatabase();

这不是处理此问题的正确方法吗?

但这会吗?

List<Object> firstList = getObjectsFromDatabase();

List<Object> list = new ArrayList<Object>(firstList);

或者如果我有一个班级

public class ReportDisplayModel<T> {

    public ReportDisplayModel(List<T> data) {
        this.data = data;
    }
    public List<T> data;
}

我想在这个模型中设置数据我会使用构造函数吗?

ReportDisplayModel<Object> model = new ReportDisplayModel<Object>(getData());

而不是

ReportDisplayModel<Object> model = new ReportDisplayModel<Object>();

model.data = getData();

只需澄清一下。感谢。

4 个答案:

答案 0 :(得分:5)

关于

List<Object> list = getObjectsFromDatabase();

VS

List<Object> firstList = getObjectsFromDatabase();
List<Object> list = new ArrayList<Object>(firstList);

任何一种方法都可以。取决于您是否希望list引用getObjectsFromDatabase()返回的列表,或者您是否希望它引用它的副本。

如果只是想打印数据库对象,第一种方法就没问题。

如果你想过滤掉一半的数据库对象(即从列表中删除对象),你就不能确定getObjectsFromDatabase()返回可变列表,那么你将不得不采用第二种方法。


关于

ReportDisplayModel<Object> model = new ReportDisplayModel<Object>(getData());

VS

ReportDisplayModel<Object> model = new ReportDisplayModel<Object>();
model.data = getData();

我更喜欢第一种方法。仅仅因为我不想担心空指针异常等,如果我不小心做了像

这样的事情
ReportDisplayModel<Object> model = new ReportDisplayModel<Object>();
model.printData();
model.data = getData();

答案 1 :(得分:5)

完全取决于getData()返回的内容。

  • 通常会返回Collections.unmodifiableList(result),以便客户端无法修改结果。

  • 如果此结果未在其他任何地方使用,并且对它的修改不会弄乱任何东西,可以按原样使用结果

很少需要使用复制构造函数 - 当您确定修改数据会影响其他组件时,请使用它。

答案 2 :(得分:2)

我不太明白你的问题,但我会试一试。

主要区别在于使用复制构造函数创建了一个新的列表独立副本,即

List<Object> firstList = getObjectsFromDatabase(); // firstList is the list returned by the database

List<Object> list = new ArrayList<Object>(firstList); //list is an independent copy of firstList

现在,如果您更改firstListgetObjectsFromDatabase()返回的列表也会更改(或者如果不支持更改,则会抛出异常)。另一方面,list可以自由更改,而不会影响原始列表。

答案 3 :(得分:1)

避免使用等号,因为它打破了封装(糟糕的做法)。转到复制构造函数(最佳实践)。