来自ImmutableList javadocs:
不同于 Collections.unmodifiableList(java.util.List中) 这是一个单独的视图 仍然可以改变的集合, ImmutableList的实例包含它 拥有私人数据,永远不会 更改。 ImmutableList很方便 用于公共静态最终列表 (“常量列表”)也可以让你 轻松制作一个“防御性副本” 列表由您提供给您的班级 呼叫者。
这是否意味着:
答案 0 :(得分:53)
不,不变性仅适用于Collection中对象的数量和引用,并不能解决您放入Collection中的对象的可变性。
不可变列表比标准JDK Collections.unmodifiableList获得的是通过使用ImmutableList可以保证引用的对象,它们的顺序和列表大小不能从任何源更改。使用Collections.unmodifiableList,如果其他内容具有对基础列表的引用,即使您引用了不可修改的列表,该代码也可以修改列表。
但是,如果您想要真正的不变性,则必须使用不可变对象填充列表。
答案 1 :(得分:17)
使用Collections.unmodifiableList
在List周围创建一个包装器。如果基础列表发生了变化,那么你的unmodifiableList视图也会发生变化。
正如文档所述,Google的代码会创建一个副本。这是一个更昂贵的计算并消耗更多的内存,但如果有人改变了原始列表,它就无法影响ImmutableList。
这些都不会阻止您更改列表中的对象,或者字段或字段字段等。
答案 2 :(得分:6)
ImmutableList
与Collections.unmodifiableList( new ArrayList( list ) )
类似。请注意,新创建的ArrayList
不分配给字段或变量。
答案 3 :(得分:3)
答案 4 :(得分:0)
您可能还想看看this question(番石榴的Collections.unmodifiableSet()
和ImmutableSet
之间有什么区别。)