这是一个简单的问题,但如果我这样做
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();
只需澄清一下。感谢。
答案 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
现在,如果您更改firstList
,getObjectsFromDatabase()
返回的列表也会更改(或者如果不支持更改,则会抛出异常)。另一方面,list
可以自由更改,而不会影响原始列表。
答案 3 :(得分:1)
避免使用等号,因为它打破了封装(糟糕的做法)。转到复制构造函数(最佳实践)。