2012-07-24 21 views
11

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

私はこの質問を受けました。私は好奇心が強いです、コンストラクタをこのように使用するためにはどのような状況が必要でしょうか?

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

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

+0

私はこの質問に投票しませんでしたが、人々はダウン投票することが「おそらくもっとエレガントな使い方があるかもしれません」と反対していると考えています* - それはかなり広く、かなり修辞的です。 – Flexo

+2

質問は:* "Javaでは、抽象クラスでプライベートコンストラクタを使用する目的は何ですか?"それは私にとって十分具体的なようです。 – assylias

+0

返信用Thx、おそらくあなたは正しいです。 – Chris

答えて

27

privateコンストラクタは、クラスのだけコンストラクタであれば、その理由は明確である:サブクラス化を防ぐために。静的フィールド/メソッドの保持者としてのみ機能するクラスもあり、インスタンス化またはサブクラス化したくないクラスもあります。 abstract修飾子がこの場合は冗長—であることに注意してください。インスタンス化が可能でない場合もあります。下の@JB Nizetの注記のように、abstract修飾子は、クラスのクライアントに間違ったシグナルを送るため、悪い習慣です。クラスは実際にfinalだったはずです。

別のユースケースは、しかし、非常にまれがあります:あなたはは、ネストしたクラスなど、独自のサブクラスが含まれていることだけprivateコンストラクタとabstract classを持つことができます。このイディオムは、ネストしたクラスがで、サブクラスがであることを保証します。実際には、Javaのenumはこのイディオムを使用します。

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

+0

私は、この場合抽象的なを使用することは冗長であるだけでなく、混乱させると言うでしょう。定義による抽象クラスは、サブクラス化されることを意味します*。クラスを抽象クラスにするが、サブクラスにはできないので、抽象クラスがどのようなものか理解できていない。 –

+0

@JBNizet理解が不足しているとは必ずしも言えませんが、クライアントを混乱させないよう気をつけないかもしれません。私がちょうど追加した私の第2段落にご注意ください。これは、 '抽象'クラスの 'private' ctorに完全な動機づけを与えます。 –

+2

良い点。しかし、私はupvoted ;-)大声で –

0

いない他のエレガントな使用は、私は考えることができる

6

だけの事は他の(保護)コンストラクタによって共有される共通のコードを再利用されることも可能です。最初の行でプライベートコンストラクタを呼び出すことができます。

2

デフォルトの引数なしのコンストラクタはprivateになり、引数を受け入れる別のコンストラクタが提供されることがあります。次に、このコンストラクタは他のプライベートコンストラクタを呼び出すことがあります。これは、実装がこれらの引数を提供するよう強制します。これは、いくつかの変数が常に初期化されることを保証するかもしれませんが、これは私の経験では一般的な方法ではありません。これが必要な場合は、変数をチェックしてIllegalArgumentExeptionを投げて、変数を初期化する必要がある理由を説明する方がよいでしょう。

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

+2

しかし、明示的に1つのコンストラクタを提供する場合、デフォルトの引数なしのコンストラクタは存在しません。したがって、これをプライベートにする理由はありません。 – Thilo

1
  1. 前述したように、共通の内部専用コンストラクタとして使用される。

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

+0

@Thilo - 私は同意しません(3)、私は奪われました - それは(1)の延長となります。 4は、特定の質問に直接適用できないことを明確にする資格があります。 –