21

最近、私は質問に直面しました: Java クラスのインスタンス化を回避するにはどうすればよいですか?

しかし、私は次のように答えました。

  1. クラスをインスタンス化したくない場合は、「abstract」修飾子を使用してください。例: javax.servlet.HttpServlet は、インスタンス化を避けるために抽象として宣言されます (ただし、そのメソッドは抽象ではありません)。

  2. 引数なしのプライベート コンストラクターを宣言します。

今私の質問は、a) 他の方法はありますか? b) クラスをインスタンス化したくないのはなぜですか? - SO で検索したところ、Util クラスをインスタンス化しないようにできることがわかりましたOOP でクラスをインスタンス化したくない他の場所はありますか?

4

5 に答える 5

29

次の 4 つの理由が思い浮かびます。

  1. 親ではなくサブクラスをインスタンス化できるようにします。
  2. 直接インスタンス化を禁止し、代わりにファクトリ メソッドを提供して戻り、必要に応じてインスタンスを作成します。
  3. Java 5 以降では、すべてのインスタンスが事前定義されているため (たとえば、トランプのスーツ)、型安全な列挙型が代わりに推奨されます。と
  4. クラスは本当にクラスではありません。これは、静的定数および/またはメソッドの単なるホルダーです。

(2) の例として、canonical オブジェクトを作成したい場合があります。たとえば、RGB 色の組み合わせ。RGB コンボの複数のインスタンスを作成したくないので、次のようにします。

public class MyColor {
  private final int red, green, blue;

  private MyColor(int red, int green, int blue) {
    this.red = red;
    this.green = green;
    this.blue = blue;
  }

  public static MyColor getInstance(int red, int green, int blue) {
    // if combo already exists, return it, otherwise create new instance
  }
}

注:別のコンストラクターが明示的に定義されているため、引数なしのコンストラクターは必要ありません。

于 2009-08-25T05:34:39.447 に答える
3

既存のすべてのインスタンスを完全に制御するために、他の人がオブジェクトをインスタンス化するのを避けたい場合があります。一例としてシングルトンパターンがあります。

于 2009-08-25T05:35:14.983 に答える
2

クラスをインスタンス化したくない最も一般的な理由は、静的クラス、つまりその静的メソッドを扱っているときだと思います。誰かがそのクラスをインスタンス化しようとするのは望ましくありません。同様に、Factory クラスを扱っている場合、または場合によっては多くのシングルトン クラスが、通常の方法でインスタンス化されないようにコンストラクターを非表示にします。

于 2009-08-25T05:34:25.750 に答える
1

クラスをインスタンス化できないようにする別の方法は、それをプライベート内部クラスとして宣言し、周囲のクラスでインスタンス化する方法を提供しないことです。しかし、これは(IMO)かなり無意味です。

クラスをインスタンス化する意味がない場合は、クラスをインスタンス化できないようにする必要があります。通常、クラスが実際には (静的) ヘルパー メソッドの単なるコレクションである場合、またはクラスが「不完全」である場合に、これを行います。不完全性は構文的に明白かもしれませんが (つまり、抽象メソッド)、他の種類の不完全性もあります。たとえば、すべてのメソッドにデフォルトのデフォルト実装を提供し、クラスが何か有用なことを行うために、そのうちの 1 つ以上をオーバーライドする必要がある場合があります。

クラスをインスタンス化不可 (または少なくとも直接インスタンス化不可) にするもう 1 つの理由は、アプリケーションがインスタンス化を制御する必要がある場合です。たとえば、java.util.regex.Pattern クラスを直接インスタンス化することはできないため、JRE はコンパイル済みの正規表現のキャッシュを維持できます。

于 2009-08-25T05:43:45.233 に答える