我们如何确保不可变对象中定义的ArrayList的不变性?

时间:2017-07-19 19:30:23

标签: java immutability

如果我在Java中定义一个ArrayList,它是私有的,最终的,只有getter。用户仍然可以通过添加或删除ArrayList来获取ArrayList并修改ArrayList。我怎么能避免这个?

3 个答案:

答案 0 :(得分:2)

您可以在列表中创建不可修改的列表。 Collections类有一个实用方法。

 List<String> unModifiableList=Collections.unmodifiableList(
                                        oldList);

在实际对象中准备好列表后,可以将其冻结。

答案 1 :(得分:0)

Unmodifiable List是您必须采取的方法。但是这是一个限制,因为这个不可修改的类正在使用通常的List并且它仍然可以修改。

final List<String> modifiable = new ArrayList<>();
modifiable.add("Java");
modifiable.add("is");

final List<String> unmodifiable = Collections.unmodifiableList(modifiable);
System.out.print("Before modification: " + unmodifiable);

modifiable.add("the");
modifiable.add("best");

System.out.print("After modification: " + unmodifiable);

在上面的代码段中输出是意外的,如下所示。

  

修改前:[Java,is]   修改后:[Java,is,the,best]

阅读this article以了解unmodifiableList 的陷阱及其解决方案。

答案 2 :(得分:0)

您可以在getter方法中返回List的新实例,并将列表作为构造函数参数。