質問: ### 前提・実現したいこと final修飾子についての理解確認。 ### 概要 final修飾子に関しては、変数・メソッド・クラスにつけることができ、 変数に関しては、定数化し、再代入をさせないということで、メリットを理解しています。 メソッド・クラスに関しては、finalをつけることにより、オーバーライド・継承をさせないためにつけるものだと思います。 オーバーライドをさせないということを実際のコーディングでのメリットとしてかみ砕くと、もしfinalを付けない、class A を継承した以下3つのクラスの b.exe() c.exe() d.exe() を読みとく場合にb,c,dの中身のふるまいを各々読まないといけない。 しかしながら、このメソッドがfinalがついていれば、一つのメソッドを読むだけでいい。というメリットだと思います。 ### 質問 1上記以外に継承・オーバーライドできないというメリットが具体的事例でありますか? また、上記Aのクラスを継承ではなくnewした場合は当然、私が上げたような読むのが楽というメリットもないと思いますので、継承した場合のみメリットを享受できるということですよね? 2クラスにつけた時点で継承できないため、そのクラス内メソッドにはfinalをつける必要はないという認識で合ってますか
回答: 1メソッドに対して`final`修飾を行うことの利点は、コードを読む量を減らすことではなく、振る舞いを破壊しないことだと思います。 結果的に読むコード量は減ると思いますけれど。 クラスやメソッドでのfinalの使い方から引用します。(これも著名な『プログラミング言語Java (The Java Series)』の引用のようです) > > もしメソッドがfinalならば、そのメソッドの実装を信頼できます。(ただし、そのメソッドがfinalではないメソッドを呼び出していなければですが)。 > > > 当然、これは継承時のオーバーライドに関する制限ですので、継承を行わなければ恩恵(影響と言ってもいいかもしれません)も何もありません。 2もちろんその通りです。 同様に、上記のページでも引用されています。 > > finalと宣言されたクラスを、他のクラスが拡張できませんし、その結果finalクラスのすべてのメソッドは実質的にfinalとなります。 > > >