イミュータブル
上の例では、Listを一旦配列に変換してから戻すという手法が使われたが、ここでは替わりにObject.clone()メソッドを用いて解決する。引数のオブジェクトを一旦clone()でコピーしてからフィールドに代入することで、引数に渡す前のListオブジェクトとの参照を切り離すことができ、引数に渡す前のListオブジェクトを変更してもImmutableCartにあるListオブジェクトのitemsにまで変更が及ばないようにすることができる。これは、getItems()メソッドでも同様に行う必要がある。Collections.checkedList(List<T>, Class<T>) は、itemsが他のメソッドに渡されたときにリストにTとは異なる型が代入されるのを防ぐためにある。パラメータ化されていない非ジェネリックのListでしか動作しないメソッドに渡すと、そのメソッドはそのListに対して型Tではない要素を不正に追加する恐れがある。Collections.unmodifiableList(List<T>)はリストの要素を変更できないようfinalにするためにある。
また、クラスが不変であるかどうかを確認する方法の一つとしてFindBugsというツールを使うという手がある。これはバグの温床になるコードを自動検出してくれて、不変クラスを作るときにも貢献する。