javaの不変クラスにfinalを修飾する理由についての質問です。 ・クラスのすべてのフィールドをprivate finalとする ・セッターメソッドを実装しない
javaの不変クラスにfinalを修飾する理由についての質問です。 ・クラスのすべてのフィールドをprivate finalとする ・セッターメソッドを実装しない ・this参照を外部に公開しない これらの条件をクリアしたクラスから生成されたインスタンスの状態は変わりようがなく、不変クラスとしてなりたっているように思えるのですが、なぜクラスをfinalで修飾する必要があるのでしょうか?? 下記URLで、finalをつけていない不変クラスの問題を指摘しているようですが、 結局、不変クラスを継承した可変クラスのインスタンスの値が変わっているだけの気がして、よくわかりませんでした・・・。 https://www.it-swarm-ja.tech/ja/java/java%E3%81%A7%E4%B8%8D%E5%A4%89%E3%82%AF%E3%83%A9%E3%82%B9final%E3%82%92%E5%AE%A3%E8%A8%80%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1069513171/ javaを初めて、3か月の初心者にわかるように説明いただけませんでしょうか?
>> 不変(イミュータブル)クラスは不変であることが非常に大きな意味を持っています(バグを防ぐ意味で)。これを継承して可変部分を付加されてしまうと、使用者に混乱を与えるだろうと言う判断かと思います。 では、finalで修飾していなくても、他の不変クラスの条件をみたしたいれば、そこから生成されたインスタンスの状態は変わらない。しかし、それを継承した、子クラスも不変クラスであると勘違いして利用されてしまう可能性があるため、それを防ぐ意味でfinalを付けるということでよろしいでしょうか?
ベストアンサー
全てのフィールドに手を出せなくとも、継承して新たな要素を付け加える事は可能ですが、 クラス自体をfinalにすると、継承すらできなくなります。 「結局、不変クラスを継承した可変クラスのインスタンスの値が変わっているだけの気が」 不変クラスを継承して可変クラスを作れてしまう事自体が問題です。 「では、finalで修飾していなくても、他の不変クラスの条件をみたしたいれば、そこから生成されたインスタンスの状態は変わらない。しかし、それを継承した、子クラスも不変クラスであると勘違いして利用されてしまう可能性があるため、それを防ぐ意味でfinalを付けるということでよろしいでしょうか?」 そういう事です。 基本的にオブジェクト指向の様々な制限は、極端な話、使う側がキチンとオブジェクトの性質と利用方法を理解していれば問題ないものです。 しかし、実際には人間はミスを犯すものですし、そんな完璧さを期待する事は間違いの元なので、 オブジェクト側(クラスの設計者)が責任を持って自らの使われ方に制限を設けることで、誤った使い方をそもそも出来ないようにする。 そうする事で間違いを未然に防ぎ、扱う側の負担を減らす。 というのが、カプセル化の根幹です。 C言語等のカプセル化機能を持たない言語では、何でも出来るが故に、全てのプログラマが完璧である事を求められますが、 そんな事は土台無理があったということの上に、それらの機能があります。 (同じカプセル化でも、C++、Java、C#と作られた時代が新しくなるほどより制限が厳しく、より安全になっています)
質問者からのお礼コメント
ご親切にありがとうございます。 オブジェクト指向の意図ともつながり、大変勉強になりました。
お礼日時:1/21 16:36