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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1573閲覧

final修飾子について

Anoaji

総合スコア49

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/09/23 07:03

###前提・実現したいこと
final修飾子についての理解確認。

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Template Method パターン

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

Java

1public abstract class TemplateMethod { 2 3 public final void execute() throws Exception { 4 Exception ex = null; 5 try { 6 if (preCondition()) { 7 doExecute(); 8 } 9 } catch(Exception e) { 10 ex = e; 11 } finally { 12 postCondition(ex); 13 } 14 } 15 16 protected abstract boolean preCondition(); 17 protected abstract void doExecute() throws Exception; 18 protected abstract void postCondition(Exception ex) throws Exception; 19 20}

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

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

投稿2016/09/23 12:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2016/09/23 07:32

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

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

投稿2016/09/23 07:31

編集2016/09/23 07:33
carimatics

総合スコア740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問