15

Javaでは、抽象クラスでプライベートコンストラクタを使用する目的は何ですか?

レビューで、私はこの質問を受け取りました。興味がありますが、どのような状況でコンストラクターをそのように使用する必要があるのでしょうか?

抽象クラスの別のコンストラクターとペアで使用できると思いますが、これは非常に簡単です。また、抽象クラスを超える静的内部クラスの構築にも使用できます。

もっとエレガントな使い方があるかも?

4

7 に答える 7

35

privateコンストラクターがクラスの唯一のコンストラクターである場合、その理由は明らかです。サブクラス化を防ぐためです。一部のクラスは、静的フィールド/メソッドのホルダーとしてのみ機能し、インスタンス化またはサブクラス化を望まない場合があります。この場合、修飾子は冗長であることに注意してください。abstract修飾子の有無にかかわらず、インスタンス化は不可能です。@JB Nizet が以下に記しているように、abstract修飾子はクラスのクライアントに間違ったシグナルを送信するため、悪い習慣でもあります。クラスは実際には であったはずfinalです。

非常にまれですが、別の使用例があります。ネストされたクラスとして独自のサブクラスを含むabstract classwith onlyprivateコンストラクターを持つことができます。このイディオムは、これらのネストされたクラスが唯一のサブクラスであることを確認します。実際、Java の s はまさにこのイディオムを使用します。enum

周りに他のコンストラクターがある場合、privateコンストラクターについて特別なことは何もありません。abstract他のクラスと同じように、クラスで使用されます。

于 2012-07-24T07:34:27.450 に答える
6

Only thing I can think of is reusing common code shared by the other (protected) constructors. They could then call the private constructor in their first line.

于 2012-07-24T07:00:37.900 に答える
3

場合によっては、デフォルトの引数なしコンストラクターが非公開になり、引数を受け入れる別のコンストラクターが提供されます。このコンストラクターは、他のプライベート コンストラクターを呼び出す可能性があります。これにより、実装にこれらの引数を提供することが強制されます。これにより、一部の変数が常に初期化される可能性がありますが、これは一般的な方法ではありません (私の経験では)。これが要件である場合は、変数をチェックして をスローしIllegalArgumentExeption、変数を初期化する必要がある理由を説明することをお勧めします。

プライベート コンストラクターのみを使用して抽象クラスを作成すると、インスタンスを作成できないため、クラスは実質的に役に立ちません。Math(パッケージ内のクラスのように) 静的メソッドのみを使用してユーティリティ クラスを作成する場合はjava.lang、プライベート コンストラクターを使用できますが、クラスを抽象としてマークするとクラスが拡張されることを意味するため、代わりにクラスを final としてマークする必要があります。

于 2012-07-24T07:08:13.683 に答える
2
  1. 前述のように、一般的な内部使用のみのコンストラクターとして使用されます。

  2. 抽象であろうとなかろうと、クラスのインスタンス化を防ぐために、静的パブリック メソッド [ヘルパー メソッド] のみを含むクラスでプライベート デフォルト コンストラクターを宣言することは珍しくありません。

于 2012-07-24T07:17:53.757 に答える
0

no other elegant use is possible

于 2012-07-24T07:00:15.257 に答える