最終的にクラスを作ることで、それを拡張することはできません。これらとは別に、拡張可能でないクラスを作成できる他の方法はありますか?サブクラス化(拡張)できないクラスを作成するさまざまな方法はありますか?
答えて
private
のすべてのコンストラクタを作成します(または、別のパッケージのサブクラスのみに関係する場合は、デフォルトのアクセス権を与えます)。private
引数なしのコンストラクタが含まれます。そのようなクラスから継承しようとするクラスは、たとえサブクラスのオブジェクトを作成しようとしてもコンパイルされません。そのようなクラスをスタティックなgetInstance(arguments)
型のメソッドでインスタンス化する機能を提供することはできます。
ただし、クラスが拡張されないようにする最も明快でクリーンな方法は、クラスをfinal
と宣言することです。
以下は、クラスがサブクラス化されないようにする方法です。
クラス
final
を宣言し、他のどのクラスもそれをサブクラス化することはできません。 これはクラスの拡張を防ぐための最良の方法です。final
キーワードはこの目的のためのものです。非公開のコンストラクタを公開しないでください。定義されたコンストラクタがない場合は、
default constructor
を定義し、private
と宣言します。このような場合、内部クラスはまだ外側のクラスを拡張することができます。したがって、クラスをfinalと宣言するほうが良いでしょう。String.java
、Integer.java
などのクラスがありますが、これらのクラスはサブクラス化できません。これらはfinal
と宣言されています。すべてのコンストラクタから実行時例外をスローします。これは、オブジェクトの作成を許可しません。例外をスローするコードなしで、オブジェクトを作成するプライベートコンストラクタを持つことができます(パブリック静的メソッドの場合もあります)。これはコンパイル時間を与えませんが、サブクラス化されたオブジェクトを作成しようとすると実行時に例外をスローします。サブクラスはコンストラクタを静的メソッドと呼び、try catchブロックでラップすることができます。これは、上記の2つほどきれいではありません。
不変性は、単にクラスfinal
を宣言するか、単にプライベートスコープにコンストラクタを制限する以上のものです。変更可能な状態も保護する必要があります。上記の答えは、サブクラス化できないクラスを持つという問題を解決するつもりです。
- 1. Android開発を通じてクラスを拡張するさまざまな方法はありますか?
- 2. さまざまなフォントサイズでUILabelを作成する方法は?
- 3. SQL Server 2012でストアドプロシージャを暗号化できるさまざまな方法はありますか
- 4. unittestをサブクラス化しないTest *クラスをpytestで無視させる方法はありますか?
- 5. SparkでRDDを作成するさまざまな方法
- 6. Pythonでオブジェクトを作成するさまざまな方法はありますか?
- 7. アプリケーションでさまざまなプロセスフローを文書化する良い方法はありますか?
- 8. クラスが別のクラスを拡張する場合、拡張クラスを拡張するのではなく、初期化することはできますか?
- 9. mainを拡張クラスでラップする方法はありますか?
- 10. PHP拡張モジュールでC++クラスをラップする方法はありますか?
- 11. スタック上にオブジェクトを作成するさまざまな方法
- 12. IFを書くさまざまな方法の違いはありますか?
- 13. jsp生成クラスがHttpServletを拡張する場合、拡張タグを使用してもう1つのクラスを拡張する方法はありますか?
- 14. サブクラスから内部クラスをオーバーライド/拡張する方法は?
- 15. 私のクラスのサブクラス化を禁止する方法はありますか?
- 16. Objective-Cでの拡張とサブクラス化、後で拡張したい電卓クラスを作成するのに適していますか?
- 17. さまざまなブラウザとさまざまなバージョン間で機能をテストするツールはありますか?
- 18. Javaラッパークラスのラップメンバーのメソッドを「拡張する」、またはショートカットを作成する方法はありますか?
- 19. Googleのグラフでさまざまな色のバーを作成する方法は?
- 20. JS/jQueryでさまざまなインタラクションモードを作成する方法は?
- 21. プロトコル専用のクラス拡張を作成することはできますか?
- 22. ネイティブメッセージングホストでパックされていないMicrosoft Edge拡張機能をデバッグする方法はありますか?
- 23. サブクラスの振る舞いをカスタマイズする方法、またはサブクラス化を特別な方法で行う方法はありますか?
- 24. Gitでさまざまなリリースストリームを構造化する適切な方法は?
- 25. コントローラーまたは作成ヘルパーを拡張する必要がありますか?
- 26. クラス要素を選択するさまざまな方法
- 27. 冗談構成ファイルを拡張する方法はありますか?
- 28. 変数を初期化するさまざまな方法
- 29. PHPDoc:さまざまなクラスプロパティオプションをドキュメント化する方法
- 30. DataTemplatesまたはUserControlを使用して、拡張クラスのさまざまなコントロールを表示する必要がありますか?
"またはそれを不変にする"と定義できますか?クラスの最終化は、クラスを不変にするステップの1つです。おそらく、「コンストラクタを非公開にする」という意味ですか? – Pshemo
正解。@ Pshemo。だから、ここで私はクラスを作ることを別に知りたいのですが、@Daniel Oによって言及された詳細を除いて他の方法もあります。コンパイル時でもこれが拡張可能ではないことを保証します。 – road2victory
@ road2victory:私はクラスがサブクラスであることを防ぐいくつかの方法を追加しました。あなたは私の答えを以下に見ることができます。 Hopefjllyそれは役に立つでしょう。 –