如果 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 是由于某些原因有意创建的。