2012-05-03 16 views
0

シングルトンパターンを実装してクラスシングルトンを作成できます。今日のシングルトンクラスは基本的な要件です。なぜ、シングルトンインスタンスがJavaのデフォルトで提供されていないのですか?

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

"Singleton"のようなマーカーインターフェイスを持ち、実行時にJVMによってオブジェクトインスタンスを一度作成することによって、とにかくClassが他のクラスを拡張していない場合、Javaコンパイラは "extends Object"を追加します。同様の手法をシングルトンの場合に適用することができます。 これは、シングルトンパターンのさまざまな実装に関する多くの時間と開発の労力と議論を節約します。代わりに全体の方法を行うの

1)同期のgetInstance()

2)のgetInstance(内部同期ブロック)これも大幅に節約します

揮発性部材としてsingleInstanceと

3)オプション2同期複数のクラスにシングルトンパターンを実装する必要がある場合(合格したクラスのシングルトンインスタンスを返すSingletonPatternFactoryクラスは考慮しません)

+1

これは主観的です - 私は投票に投票しました。 Btw:列挙型を使用することによって、常に簡単にシングルトンを実装できます。 – home

+9

シングルトンクラスは基本的な要件ではありません。クラスシングルトンを作るときは、本当に注意が必要です。あなたがその選択をしたら、後でそれを変更することはできないからです。 – Naveen

+2

多分、OPは怠惰なシングルトンについて話しています。それは、そのシンクロナイゼーションパターンが意味をなさす唯一の方法です。ほとんどの実用的なアプリケーションでは、単体はIoCコンテナによってJavaのイディオムよりもはるかに優れています。 –

答えて

2

あなたは代わりにシングルトンパターンの列挙型を使用することができます - これは非常に複雑ではありません。

public enum Singleton { 
    INSTANCE; 
} 
+0

あなたがスーパークラスを必要としない場合は良いアプローチです*。 –

+0

@Daniel true - スーパークラスのインタフェースを実装していて、スーパークラスの実際の実装が不要な場合は、スーパークラスのインタフェースを実装できます。 – assylias

5

のは、シングルトンを作成するために必要なすべてのステップを見てみましょう:

  1. プライベートコンストラクタ
  2. のstatic finalフィールド
  3. readResolvewriteObject
の(オプション)クラスが直列化可能になりたい場合は、些細な実装

私が出会ったほとんどのシングルトンは、シリアライズを気にしないので、3番目のステップは必要ありません。これにより、本当に簡単な2つのステップが残されます。

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

    private Whatever() {} 
} 

あなたがクラスにアクセスするまで、コンストラクタが実行されませんので、それはそれだけのシングルトンインスタンスを取得することと思われる、でもレイジーロードされます。私は、あなたの "たくさんの"あなたの定義が時間と開発努力に及ぼすかどうかはわかりませんが、私はこれが厄介であるとは考えていません。

0

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

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

最後に、同じことはほとんどのパターンの真実と言えるでしょう。特定のパターンのセットを採用したり支持したりするための言語が巨大な必要はありません、IMHO。

3

魅力的な理由がない限り、基本的なデザインパターンの実装は、コア言語の責任ではありません。デザインパターンが出てきます。たとえば、シングルトンパターンは決して使用すべきではない非常に悪いパターンと広く見なされています。とにかくそれを使用することを決めたとしても、熱心なシングルトンを望みますか?レイジーシングルトン?インスタンス化が何らかの理由で失敗した場合はどうなりますか?カバーするべき軽度の問題はたくさんありますが、この機能を言語に追加することは簡単な変更ではありません。

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

0

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

あなたが示唆していることは、伝統的なクラスシステムの外で動作するものです。おそらく、これは新しいオブジェクト型(enumがクラスではない方法に似ています)として実行できますが、間違いなく標準のインターフェイスやクラスとしてはできません。

関連する問題