2016-10-25 8 views
0

最終的にクラスを作ることで、それを拡張することはできません。これらとは別に、拡張可能でないクラスを作成できる他の方法はありますか?サブクラス化(拡張)できないクラスを作成するさまざまな方法はありますか?

+0

"またはそれを不変にする"と定義できますか?クラスの最終化は、クラスを不変にするステップの1つです。おそらく、「コンストラクタを非公開にする」という意味ですか? – Pshemo

+0

正解。@ Pshemo。だから、ここで私はクラスを作ることを別に知りたいのですが、@Daniel Oによって言及された詳細を除いて他の方法もあります。コンパイル時でもこれが拡張可能ではないことを保証します。 – road2victory

+0

@ road2victory:私はクラスがサブクラスであることを防ぐいくつかの方法を追加しました。あなたは私の答えを以下に見ることができます。 Hopefjllyそれは役に立つでしょう。 –

答えて

2

privateのすべてのコンストラクタを作成します(または、別のパッケージのサブクラスのみに関係する場合は、デフォルトのアクセス権を与えます)。private引数なしのコンストラクタが含まれます。そのようなクラスから継承しようとするクラスは、たとえサブクラスのオブジェクトを作成しようとしてもコンパイルされません。そのようなクラスをスタティックなgetInstance(arguments)型のメソッドでインスタンス化する機能を提供することはできます。

ただし、クラスが拡張されないようにする最も明快でクリーンな方法は、クラスをfinalと宣言することです。

1

以下は、クラスがサブクラス化されないようにする方法です。

  1. クラスfinalを宣言し、他のどのクラスもそれをサブクラス化することはできません。 これはクラスの拡張を防ぐための最良の方法です。 finalキーワードはこの目的のためのものです。

  2. 非公開のコンストラクタを公開しないでください。定義されたコンストラクタがない場合は、default constructorを定義し、privateと宣言します。このような場合、内部クラスはまだ外側のクラスを拡張することができます。したがって、クラスをfinalと宣言するほうが良いでしょう。 String.javaInteger.javaなどのクラスがありますが、これらのクラスはサブクラス化できません。これらはfinalと宣言されています。

  3. すべてのコンストラクタから実行時例外をスローします。これは、オブジェクトの作成を許可しません。例外をスローするコードなしで、オブジェクトを作成するプライベートコンストラクタを持つことができます(パブリック静的メソッドの場合もあります)。これはコンパイル時間を与えませんが、サブクラス化されたオブジェクトを作成しようとすると実行時に例外をスローします。サブクラスはコンストラクタを静的メソッドと呼び、try catchブロックでラップすることができます。これは、上記の2つほどきれいではありません。

不変性は、単にクラスfinalを宣言するか、単にプライベートスコープにコンストラクタを制限する以上のものです。変更可能な状態も保護する必要があります。上記の答えは、サブクラス化できないクラスを持つという問題を解決するつもりです。

関連する問題