質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

final修飾子について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,142

score 49

前提・実現したいこと

final修飾子についての理解確認。

概要

final修飾子に関しては、変数・メソッド・クラスにつけることができ、
変数に関しては、定数化し、再代入をさせないということで、メリットを理解しています。

メソッド・クラスに関しては、finalをつけることにより、オーバーライド・継承をさせないためにつけるものだと思います。

オーバーライドをさせないということを実際のコーディングでのメリットとしてかみ砕くと、もしfinalを付けない、class A を継承した以下3つのクラスの
b.exe()
c.exe()
d.exe()
を読みとく場合にb,c,dの中身のふるまいを各々読まないといけない。
しかしながら、このメソッドがfinalがついていれば、一つのメソッドを読むだけでいい。というメリットだと思います。

質問

①上記以外に継承・オーバーライドできないというメリットが具体的事例でありますか?
また、上記Aのクラスを継承ではなくnewした場合は当然、私が上げたような読むのが楽というメリットもないと思いますので、継承した場合のみメリットを享受できるということですよね?
②クラスにつけた時点で継承できないため、そのクラス内メソッドにはfinalをつける必要はないという認識で合ってますか

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

①メソッドに対してfinal修飾を行うことの利点は、コードを読む量を減らすことではなく、振る舞いを破壊しないことだと思います。
結果的に読むコード量は減ると思いますけれど。
クラスやメソッドでのfinalの使い方から引用します。(これも著名な『プログラミング言語Java (The Java Series)』の引用のようです)

もしメソッドがfinalならば、そのメソッドの実装を信頼できます。(ただし、そのメソッドがfinalではないメソッドを呼び出していなければですが)。

当然、これは継承時のオーバーライドに関する制限ですので、継承を行わなければ恩恵(影響と言ってもいいかもしれません)も何もありません。

②もちろんその通りです。
同様に、上記のページでも引用されています。

finalと宣言されたクラスを、他のクラスが拡張できませんし、その結果finalクラスのすべてのメソッドは実質的にfinalとなります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

1.の「finalなメソッドの用途」ですが、セキュリティ上の理由により実装を上書きされたくないような場合にも使えます(もちろん、そういうクラスライブラリを提供する側としての利点ですが)。ふつうのプログラムを書く上では、むやみに付ける必要はないかもしれません

2.の「クラス全体をfinalにした場合」ですが、そもそも継承ができなければ個別にfinalがあってもなくても全く関係しません。特に何かが変わることもありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Template Method パターン

制御の流れを固定するために、メソッドをfinalにします。拡張したい機能はabstractにします。
フレームワークを設計するときに、固いところと柔らかいところを明確にします。

public abstract class TemplateMethod {

    public final void execute() throws Exception {
        Exception ex = null;
        try {
            if (preCondition()) {
                doExecute();
            }
        } catch(Exception e) {
            ex = e;
        } finally {
            postCondition(ex);
        }
    }

    protected abstract boolean preCondition();
    protected abstract void doExecute() throws Exception;
    protected abstract void postCondition(Exception ex) throws Exception;

}


execute()は制御の流れなので、オーバーライドできません。

抽象メソッドはサブクラスで機能を実装します。
preCondition()
doExecute()
postCondition(Exception ex)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る