Java 如何确保在不可变对象中定义的ArrayList的不可变性?
如果我在Java中定义一个ArrayList,它是私有的、最终的,并且只使用getter。用户仍然可以获取ArrayList并通过添加或删除ArrayList中的元素来修改ArrayList。如何避免这种情况?您可以从列表中创建一个不可修改的列表。类具有用于此的实用程序方法Java 如何确保在不可变对象中定义的ArrayList的不可变性?,java,immutability,Java,Immutability,如果我在Java中定义一个ArrayList,它是私有的、最终的,并且只使用getter。用户仍然可以获取ArrayList并通过添加或删除ArrayList中的元素来修改ArrayList。如何避免这种情况?您可以从列表中创建一个不可修改的列表。类具有用于此的实用程序方法 List<String> unModifiableList=Collections.unmodifiableList( oldLi
List<String> unModifiableList=Collections.unmodifiableList(
oldList);
List unModifiableList=Collections.unModifiableList(
旧名单);
一旦在实际对象中准备好列表,就可以将其冻结。是您必须采取的方法。但是有一个限制,因为这个不可修改的类使用一个普通的列表,并且它仍然是可修改的
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);
final List modifiable=new ArrayList();
添加(“Java”);
可修改。添加(“is”);
最终列表不可修改=集合。不可修改列表(可修改);
系统输出打印(“修改前:+不可修改);
可修改。添加(“该”);
可修改。添加(“最佳”);
系统输出打印(“修改后:+不可修改);
在上述代码段中,输出意外,如下所示
修改前:[Java,is]
修改后:[Java,is,the,best]
阅读以了解不可修改列表的陷阱及其解决方案。您只需在getter方法中返回列表的新实例,并将列表作为构造函数参数。这是正确答案。只需返回一份列表副本,如果客户愿意,就让他们玩它。请注意,使列表中的对象也不可变是一个完全不同的挑战。。。