0

シングルトンパターンを実装することで、クラスをシングルトンにすることができます。現在、シングルトンクラスは基本的な要件です。

JVM が実行時に Singleton オブジェクトの作成を単独で処理しないのはなぜですか?

「Singleton」のようなマーカー インターフェイスを持ち、実行時に JVM によって一度オブジェクト インスタンスを作成することによって。とにかく、クラスが他のクラスを拡張していない場合、Javaコンパイラは「拡張オブジェクト」を追加します。シングルトンの場合にも同様のアプローチを適用できます。これにより、Singleton パターンのさまざまな実装に関する多くの時間と開発作業と議論が節約されます。

1) 同期された getInstance()

2) メソッド全体を同期させるのではなく、getInstance() 内の同期ブロック

3) 揮発性メンバーとして singleInstance を使用するオプション 2

これにより、複数のクラスでシングルトン パターンを実装する必要がある場合に、多くの時間と重複する労力を節約できます (渡されたクラスのシングルトン インスタンスを返す SingletonPatternFactory クラスは考慮されません)。

4

5 に答える 5

5

シングルトンを作成するために必要なすべての手順を見てみましょう。

  1. プライベート コンストラクター
  2. 静的最終フィールド
  3. (オプション) クラスをシリアライズ可能にしたい場合は、readResolveとの簡単な実装writeObject

私が遭遇したほとんどのシングルトンはシリアル化を気にしないため、3 番目のステップは必要ありません。これで、非常に簡単な 2 つの手順が残ります。

public class Whatever extends WhateverElse {
    public static final Whatever INSTANCE = new Whatever();

    private Whatever() {}
}

クラスにアクセスするまでコンストラクターは実行されないため、コンストラクターは遅延ロードされます。これは、そのシングルトンインスタンスを取得するためだけです。時間と開発努力に関して、あなたの「たくさん」の定義が何であるかはわかりませんが、これが面倒だとは思いません。

于 2012-05-03T17:41:50.870 に答える
3

基本的な設計パターンの実装は、やむを得ない理由がない限り、コア言語の責任ではありません。設計パターンは行き来します。たとえば、シングルトン パターンは、絶対に使用してはならない非常に悪いパターンと広く見なされています。とにかくそれを使用することにした場合でも、熱心なシングルトンが必要ですか? レイジーシングルトン?何らかの理由でインスタンス化が失敗した場合はどうすればよいですか? カバーしなければならない一見マイナーな問題がたくさんありますが、この機能を言語に追加することは些細な変更ではありません。

自分で実装することで、必要な機能と動作を正確に得ることができます。

于 2012-05-03T17:45:52.257 に答える
2

シングルトン パターンの代わりに列挙型を使用できます。これはそれほど複雑ではありません。

public enum Singleton {
    INSTANCE;
}
于 2012-05-03T17:33:09.660 に答える
0

インターフェイスには独自の動作がないため、シングルトンインターフェイスは必要ありません。抽象クラスが必要になるでしょう...ある種。実際には、単なる抽象的な親よりもはるかに強力なものが必要になります。親で定義されたgetInstance()メソッドで呼び出す必要のあるプライベートコンストラクター(またはプライベートコンストラクターを呼び出して単一のインスタンスを返すプライベートインスタンス化メソッド)が必要です(スコープ違反)。

あなたが提案しているのは、伝統的な階級制度の外で機能するものです。おそらく、新しいオブジェクトタイプとして実行できますが(列挙型がクラスではない場合と同様)、標準のインターフェイスまたはクラスとしては実行できません。

于 2012-05-03T17:50:45.953 に答える
0

シングルトンには、遅延初期化を行うものと熱心な初期化を行うものの 2 つの基本的なカテゴリがあります。

シングルトンのフレーバーに関する全体的な議論は別として、多くの Java 開発者はシングルトンを悪いもの、またはアンチパターンと見なしています。これはおそらく、現在 Java 仕様を維持している人々の間で意見の相違がある分野です。

最後に、ほとんどのパターンについて同じことが言えます。言語が特定のパターンのセットを採用または承認する必要はあまりありません.IMHO.

于 2012-05-03T17:45:20.253 に答える