2017-03-12 17 views
0

免責事項:この質問があまりにも基本的な場合はお詫び申し上げます。シングルトン(伝統的な列挙型)

私はシングルトンについて学んでいますが、その実装は簡単ですが、これらの相違点は純粋にコーディング設定か、何か不足していますか?

シングルトンクラス

public enum SerialNumberGen { 
INSTANCE; 

private int count; 

public synchronized int getNextSerial(){ 
    return count++; 
} 

実装例

.println(SerialNumberGenerator.INSTANCE.getNextSerial()); 

マイ実装

SerialNumberGen gen = SerialNumberGen.INSTANCE; 
System.out.println(gen.getNextSerial()); 

私の実装はまだシングルトンパターンを守っていますか?または、これがEnumクラスの参照方法です。

ありがとうございました。

+0

[Javaでシングルトンパターンを実装する効率的な方法は何ですか?](http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-変更可能な列挙型を検討する前に[Read this](http://errorprone.info/bugpattern/ImmutableEnumChecker) – Tom

+0

を参照してください。 –

+0

ようこそスタックオーバーフロー! [ツアー](http://stackoverflow.com/tour)を見て回り、[ヘルプセンター](http://stackoverflow.com/help)、特に[どのように私に質問しますか良い質問?](http://stackoverflow.com/help/how-to-ask)と[ここで私はどのような話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)。 - Singelton *(パターン)について学んだら、**忘れてしまいましょう!** Singeltonは60年のプログラミングの歴史から悪い考えであることを知っています。 –

答えて

1

私の実装はまだシングルトンパターンを守っていますか?

はい。まだSerialNumberGenのインスタンスが1つだけあります。

2つ目のケースの追加変数とは別に、2つの違いはありません。


enumを慎重に考える必要があります。 The view epoused by Google's Java libraries teamは:

静的状態は危険ですが、列挙型は非常に悪いです。 enum値は定数であるとみなし、enum定数を "enum constant"と呼んでいます。状態が変わった場合やスレッドセーフでない場合は非常に驚きます。

エンティティは、スレッドセーフでシングルトンを作成するのに便利な方法ですが、ここで行っている処理に必ずしも適しているとは限りません。

ここで大きな問題はなぜシングルトンが必要だと思いますか?What is so bad about singletons?をよくお読みになることをお勧めします。

実際にはにはシングルトンが必要です。 SerialNumberGenという単一のインスタンスを持つだけで、必要な場所に注入することができます。

+0

これはコーディングの好みの問題ですか?私はクラスのオブジェクトを作ってそれを参照したので、コードの長い行をタイプしたくないだけですが、それでもまだ素晴らしいですか? – Glaube

+0

"長い"コード行が必要ない場合は、1)静的インポートを使用してください。 2)より大きなモニターを購入する。 –

+0

私はJavaのデザイン原則/パターンを学んでいるだけなので、どのように動作するかを学ぶ以外に、シングルトンに本当の必要はありません - 私たちが与えられた例が実装するのが最良かどうか。助けてくれてありがとう! – Glaube

0

まだシングルトンです。

しかし、注意してください:より良いアプローチは、あなたが例えば

Service service = ServiceProvider.INSTANCE 

を行うことができるように

public enum ServiceProvider implements Service { 

ように、インターフェイスに特定の動作をカプセル化することです。そこから行く。私も通常の

class ServiceImpl implements Service { 

を作成し、それがさらにそのサービス・インターフェースシングルトンを提供

  • を提供

    1. の責任を分離するのに役立ちますよう

      public enum ServiceProvider implements Service { 
          INSTANCE; 
      
          private final Service delegate = new ServiceImpl() 
      

      を行う

    また、ユニットテストを書くときに役立ちます。

  • +0

    ありがとうございました、私は、今のところ、この種の実装に移りつつあると思いますが、これは基本的なことですが、私はそれを念頭に置いています! – Glaube

    +0

    あなたは大歓迎です。私の助けを借りて嬉しいです。 – GhostCat