@ITでオブジェクトの不変性を保障するには・・・みたいなネタが挙がっていたのでちょっと書きたいと思います。
まずfinalな変数は不変であるかというと、不変ではありません。変数が示す参照値が不変になるだけで、参照によって指し示されるインスタンス自体は不変ではない可能性があります。可能性があるというのはインスタンスの特性次第ということです。
このように、final変数が不変性を意味しない事が分かると思います。では不変であることを保障する為にはどうすればよいのでしょうか。これにはいくつかの方法があります。
まず、状態の変更が可能なメソッドを、そもそも公開しないパターンです。インターフェイスを使用して、公開範囲を限定的にします。
次に、デコレータパターンでラップして、状態変更メソッドを実行すると例外をスローするパターン。
そして最後にクローンを渡すパターン。クローンだから変更されても何も影響がないという方法で、不変ではないのですが、変更されても問題にならないようにする方法です。
ちなみに、元ネタはこちらです。 変更しない変数にfinalを付けるべきですか?