卢声远*_* Lu 42 java immutability guava
JavaDoc ImmutableSet
说:
与
Collections.unmodifiableSet
可以更改的单独集合的视图不同,此类的实例包含其自己的私有数据,并且永远不会更改.这个类对于公共静态最终集("常量集")很方便,也可以让你轻松地为调用者提供给你的类的集合制作一个"防御性副本".
但ImmutableSet
仍然存储元素的参考,我无法弄清楚差异Collections.unmodifiableSet()
.样品:
StringBuffer s=new StringBuffer("a");
ImmutableSet<StringBuffer> set= ImmutableSet.of(s);
s.append("b");//s is "ab", s is still changed here!
Run Code Online (Sandbox Code Playgroud)
谁能解释一下呢?
Jon*_*eet 86
考虑一下:
Set<String> x = new HashSet<String>();
x.add("foo");
ImmutableSet<String> guava = ImmutableSet.copyOf(x);
Set<String> builtIn = Collections.unmodifiableSet(x);
x.add("bar");
System.out.println(guava.size()); // Prints 1
System.out.println(builtIn.size()); // Prints 2
Run Code Online (Sandbox Code Playgroud)
换句话说,ImmutableSet
尽管它是由可能改变而构建的集合,但它是不可变的 - 因为它创建了一个副本.Collections.unmodifiableSet
防止直接更改返回的集合,但它仍然是可能更改的后备集的视图.
请注意,如果您开始更改任何集合引用的对象的内容,则无论如何都会关闭所有投注.不要那样做.实际上,首先使用可变元素类型创建集合并不是一个好主意.(使用可变密钥类型的Ditto映射.)
Col*_*inD 19
除了Jon提到的行为差异之外,创造者ImmutableSet
和Set
创造者之间的重要区别在于Collections.unmodifiableSet
它ImmutableSet
是一种类型.您可以传递一个,并通过使用ImmutableSet
而不是Set
整个代码使组件保持不变.有了Collections.unmodifiableSet
,返回的类型只是Set
...所以很明显该集合在创建它的位置是不可修改的,除非你在传递的地方添加Javadoc,Set
说"这个集合是不可修改的".