[解決済み] Java の `final` メソッド:何を約束するのか?
質問
Java のクラスでは、メソッドを次のように定義することができます。
final
は、このメソッドがオーバーライドされてはならないことを示すものです。
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
それは明らかで、偶発的なオーバーライドから保護したり、パフォーマンスを向上させたりするために役立つかもしれません。
私の疑問は OOPの観点から、私は、メソッド
final
クラスデザイナーは
約束
このメソッドは、常に記述された、あるいは暗示されたとおりに動作します。しかし、しばしばこれはクラスの作者の影響外である場合があります。
プロパティ
.
構文的な制約は明確ですが、OOP的な意味合いではどうなのでしょうか?はたして
final
は、ほとんどのクラス作成者がこの意味で正しく使用しているのでしょうか?
はどのような契約なのでしょうか?
final
メソッドは約束しますか?
どのように解決するのですか?
前述のとおりです。
final
は、Javaメソッドで使用され、そのメソッドがオーバーライド(オブジェクトスコープの場合)または非表示(静的の場合)できないことを示します。これにより、元の開発者はサブクラスによって変更されない機能を作成することができ、それが保証されるだけです。
これは、メソッドが非公開フィールドやメソッドなど、カスタマイズ可能な他のコンポーネントに依存している場合、最終的なメソッドの機能がまだカスタマイズ可能である可能性があることを意味します。しかし、これは(ポリモーフィズムによって)部分的なカスタマイズが可能になるため、良いことです。
何かをカスタマイズできないようにする理由には、以下のようなものがあります。
-
<強い パフォーマンス -- コンパイラの中には、特に副作用のない操作を解析して最適化できるものがあります。
-
カプセル化されたデータを取得する -- イミュータブルオブジェクトは、構築時に属性が設定され、決して変更されることのないオブジェクトです。あるいは、その属性から計算された値。良い例として、Javaの
String
クラスがあります。 -
信頼性と契約 -- オブジェクトは、プリミティブ(
int
,char
,double
など)および/または他のオブジェクト。これらの構成要素に適用可能なすべての操作が、より大きなObjectで使用される場合にも適用可能であり、論理的であるべきとは限らない。メソッドにfinal
修飾子を使用すると、それを確実にすることができます。Counterクラスが良い例です。
public class Counter {
private int counter = 0;
public final int count() {
return counter++;
}
public final int reset() {
return (counter = 0);
}
}
もし
public final int count()
メソッドが
final
というようなことができます。
Counter c = new Counter() {
public int count() {
super.count();
return super.count();
}
}
c.count(); // now count 2
あるいはこんな感じ。
Counter c = new Counter() {
public int count() {
int lastCount = 0;
for (int i = super.count(); --i >= 0; ) {
lastCount = super.count();
}
return lastCount;
}
}
c.count(); // Now double count
関連
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
JQuery DataTable 详解
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
javaでクラスを作成すると、enclosing classでないように見える
-
JSPで「リストが型解決できない!」の解決方法
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法