如果我在Java中定义了一个私有的,最终的和只有getter的ArrayList。仍然用户可以通过添加或删除元素来获取ArrayList并修改ArrayList。我怎样才能避免这种情况?如何确保在不可变对象中定义的ArrayList的不变性?
3
A
回答
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中,是] 修改后:Java的,是的,最好的]
阅读this article了解unmodifiableList的陷阱,并为他们的解决方案。
2
您可以在列表中创建一个不可修改的列表。 Collections类有这方面的实用方法。
List<String> unModifiableList=Collections.unmodifiableList(
oldList);
一旦在实际对象中准备好列表,就可以将其冻结。
0
您可以使用列表作为构造函数参数在您的getter方法中返回List的新实例。
相关问题
- 1. 如何使Scala的不可变集合保存不可变对象
- 2. 性能不可变的对象设计
- 3. 如何在不可变对象
- 4. 保留对目标c中的可变和不可变对象的计数?
- 5. 在C中的对象的不可变属性#
- 6. 不可变对象内的可变对象
- 7. 可变对象和不可变对象之间的区别
- 8. 任何方式来从C#中的不可变对象派生可变对象?
- 9. 为什么不可变的对象抛出UnboundLocalError但可变的对象不?
- 10. val或var在不可变对象中的含义
- 11. JSON - >不可变的自定义Java对象。 JSON中的数据不足
- 12. 如何操作不可变对象树?
- 13. 创建用户定义的不可变对象
- 14. Python 3用户定义的不可变类对象
- 15. C++中的不可变对象的可变容器
- 16. 克隆Java中的不可变对象
- 17. 在JSP中创建不可变对象
- 18. 不确定如何定义一个C#类具有可变属性名
- 19. Hibernate不可变值对象
- 20. 对象不可变异
- 21. 有效不可变对象
- 22. ArrayList的自定义对象
- 23. java中的可变和不可变对象
- 24. 对象的不确定性是不确定的
- 25. 将可变对象转换为不可变对象
- 26. 与对象initialisers不可变对象
- 27. [Java]如何设置对象的ArrayList中的whats到不同类型的变量?
- 28. PHP中的可变对象属性
- 29. Javascript确保对象不是由空或者对象定义的对象
- 30. JML,不变量的精确定义
这是正确的答案。只要返回一份清单的副本,让客户随时随地玩就可以了。请注意,使列表中的对象也是不可变的是一个完全不同的挑战...... –