我使用番石榴已经有一段时间了,并且非常信任它,直到昨天我偶然发现了一个例子,这让我开始思考。长话短说,这里是:
public static void testGuavaImmutability(){
StringBuilder stringBuilder = new StringBuilder("partOne");
ImmutableList<StringBuilder> myList = ImmutableList.of(stringBuilder);
System.out.println(myList.get(0));
stringBuilder.append("appended");
System.out.println(myList.get(0));
}
运行后,您可以看到ImmutableList中条目的值已更改。如果这里涉及两个线程,一个可能碰巧看不到另一个的更新。
另外,让我非常不耐烦的事情是 Effective Java 中的 Item15,第五点是这样说的:
在构造函数中制作防御副本——这看起来很合逻辑。
查看 ImmutableList 的源代码,我看到:
SingletonImmutableList(E element) {
this.element = checkNotNull(element);
}
因此,实际上没有复制,尽管我不知道在这种情况下如何实现通用深度复制(可能是序列化?)。
那么..为什么它们被称为不可变呢?