Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保在不可变对象中定义的ArrayList的不可变性?_Java_Immutability - Fatal编程技术网

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

Java 如何确保在不可变对象中定义的ArrayList的不可变性?,java,immutability,Java,Immutability,如果我在Java中定义一个ArrayList,它是私有的、最终的,并且只使用getter。用户仍然可以获取ArrayList并通过添加或删除ArrayList中的元素来修改ArrayList。如何避免这种情况?您可以从列表中创建一个不可修改的列表。类具有用于此的实用程序方法 List<String> unModifiableList=Collections.unmodifiableList( oldLi

如果我在Java中定义一个ArrayList,它是私有的、最终的,并且只使用getter。用户仍然可以获取ArrayList并通过添加或删除ArrayList中的元素来修改ArrayList。如何避免这种情况?

您可以从列表中创建一个不可修改的列表。类具有用于此的实用程序方法

 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方法中返回列表的新实例,并将列表作为构造函数参数。

这是正确答案。只需返回一份列表副本,如果客户愿意,就让他们玩它。请注意,使列表中的对象也不可变是一个完全不同的挑战。。。