私はしばらくの間グアバを使用していて、昨日例に出くわすまで、それを本当に信頼していました。それは私に考えさせられました。簡単に言えば、ここにあります:
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内のエントリの値が変更されたことがわかります。ここに2つのスレッドが含まれている場合、一方が他方の更新を確認できない可能性があります。
また、私が答えを非常に待ち焦がれているのは、Effective JavaのItem15、ポイント5が次のように言っていることです。
コンストラクターで防御コピーを作成します-これはかなり論理的なようです。
ImmutableListのソースコードを見ると、次のようになっています。
SingletonImmutableList(E element) {
this.element = checkNotNull(element);
}
したがって、実際にはコピーは作成されませんが、そのような場合に一般的なディープコピーがどのように実装されるかはわかりません(シリアル化の可能性がありますか?)。
それで..なぜ彼らは不変と呼ばれるのですか?