如果 Collection 包含可变项,如何正确实现防御性副本?
How to implement a defensive copy correctly if Collection contains mutable items?
如果 class 包含一个集合并且集合中的项目代表可变数据,请您说明一下确保 class 不变性的最佳方法是什么?
从我的角度来看,应该这样做:
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);
}
}
但上面的解决方案似乎并不简洁。
还有,item的type没有提供publiccopy constructor,而不是Date怎么办?在这种情况下我应该如何防御复制它们?
帕维尔!
你的例子在防御性文案的问题上很好。实际上,您的 class 是不可变的,因为内部结构无法修改。
关于集合中的可变元素,通常您不应该关心它,因为几乎总是可变的 classes 是由于某些原因有意创建的。
如果 class 包含一个集合并且集合中的项目代表可变数据,请您说明一下确保 class 不变性的最佳方法是什么?
从我的角度来看,应该这样做:
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);
}
}
但上面的解决方案似乎并不简洁。 还有,item的type没有提供publiccopy constructor,而不是Date怎么办?在这种情况下我应该如何防御复制它们?
帕维尔!
你的例子在防御性文案的问题上很好。实际上,您的 class 是不可变的,因为内部结构无法修改。
关于集合中的可变元素,通常您不应该关心它,因为几乎总是可变的 classes 是由于某些原因有意创建的。