質問: javaの不変クラスにfinalを修飾する理由についての質問です。 ・クラスのすべてのフィールドをprivate finalとする ・セッターメソッドを実装しない
回答: 全てのフィールドに手を出せなくとも、継承して新たな要素を付け加える事は可能ですが、 クラス自体をfinalにすると、継承すらできなくなります。 「結局、不変クラスを継承した可変クラスのインスタンスの値が変わっているだけの気が」 不変クラスを継承して可変クラスを作れてしまう事自体が問題です。 「では、finalで修飾していなくても、他の不変クラスの条件をみたしたいれば、そこから生成されたインスタンスの状態は変わらない。しかし、それを継承した、子クラスも不変クラスであると勘違いして利用されてしまう可能性があるため、それを防ぐ意味でfinalを付けるということでよろしいでしょうか?」 そういう事です。 基本的にオブジェクト指向の様々な制限は、極端な話、使う側がキチンとオブジェクトの性質と利用方法を理解していれば問題ないものです。 しかし、実際には人間はミスを犯すものですし、そんな完璧さを期待する事は間違いの元なので、 オブジェクト側(クラスの設計者)が責任を持って自らの使われ方に制限を設けることで、誤った使い方をそもそも出来ないようにする。 そうする事で間違いを未然に防ぎ、扱う側の負担を減らす。 というのが、カプセル化の根幹です。 C言語等のカプセル化機能を持たない言語では、何でも出来るが故に、全てのプログラマが完璧である事を求められますが、 そんな事は土台無理があったということの上に、それらの機能があります。 (同じカプセル化でも、C++、Java、C#と作られた時代が新しくなるほどより制限が厳しく、より安全になっています)