如果Collection包含可变项,如何正确实现防御性副本?

时间:2018-04-01 17:41:06

标签: java collections immutability

如果该类包含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,我应该怎么做,项目的类型不提供公共拷贝构造函数?在这种情况下我应该如何防御他们?

1 个答案:

答案 0 :(得分:0)

的Pavel!

你的榜样在防御性副本问题上是个好消息。实际上,您的类是不可变的,因为内部不能被修改。

那么集合中的可变元素呢,通常你不应该关心它,因为几乎总是由于某些原因故意创建了可变类。