如果该类包含Collection并且Collection中的项目代表可变数据,请您澄清一下确保类不变性的最佳方法是什么?
从我的观点来看,应该这样做:
public class DateContainer {
private final List<Date> dates;
public DateContainer(List<Date> dates) {
this.dates = new ArrayList<>();;
for (Date date : dates) {
this.dates.add(new Date(date.getTime()));
}
}
public void addItems(Date date) {
Date temp = new Date(date.getTime());
dates.add(temp);
}
public List<Date> getItems() {
List<Date> temp = new ArrayList<>();;
for (Date date : dates) {
temp.add(new Date(date.getTime()));
}
return Collections.unmodifiableList(temp);
}
}
但上述解决方案似乎并不简洁。 另外,如果不是Date,我应该怎么做,项目的类型不提供公共拷贝构造函数?在这种情况下我应该如何防御他们?
答案 0 :(得分:0)
的Pavel!
你的榜样在防御性副本问题上是个好消息。实际上,您的类是不可变的,因为内部不能被修改。
那么集合中的可变元素呢,通常你不应该关心它,因为几乎总是由于某些原因故意创建了可变类。