2011-06-27 10 views
1

可能性の重複:
Efficient way to implement singleton pattern in Java適切なシングルトンデザイン?

私は自分のアプリケーションのための状態セーバーとして動作するシングルトンクラスを持っています。たとえば、データがあるビューを持っている場合、保存された状態のシリアライズ可能なオブジェクトにデータを貼り付け、後で再検索のためにシングルトンに渡します。これはすべて自然で適切なようですが、私はWikiのシングルトンの例から逸脱しています。私がインスタンスを取得してメソッドを呼び出せるようにするgetインスタンスメソッドを持つInteadでは、代わりにすべてのメソッドを静的に設定し、クラスを静的に使用します。

この悪いフォームですか?パフォーマンスが失われますか?任意のヒントについて

感謝〜アエードーン

+3

[ここをクリック](http://stackoverflow.com/questions/70689/efficient-way-to-implement-singleton-pattern-in-java) – Howard

答えて

4

静的使用がお客様のニーズを満たしている場合、私はその中に悪いことはありません。

唯一の欠点は、わずかに柔軟性が低いことです。実際のシングルトンとして設計した場合は、状態を管理するためのインターフェイスを持ち、特定の状況の特定の実装をインスタンス化することができます。このオブジェクトは、引数としてアプリケーションに渡されます。

厳密に静的なクラスを使用すると、渡すオブジェクトがないので、Classオブジェクトを渡して、そのインターフェイスを通じて関数にアクセスする必要があります。

もちろん、これはすべて、現在のクラスの合理的な機能を超えて拡大する可能性がある場合にのみ重要です。

+0

興味深いことにありがとうございました。私がすべて静的に行った理由の1つは、アクセスの容易さ(レイジーなデザインを表現する素晴らしい方法)です。アプリケーションをより深く理解して、データにアクセスするのがやや面倒であることが分かったら、すべての静的クラスを使用するほうが簡単です。 – AedonEtLIRA

+1

ええ、それをシングルトンにするだけで、それぞれの用途に1行のコードを追加するだけです。つまり、 "foo = Single.getFoo();"の代わりに "あなたは "Single single = Single.getIntance(); foo = single.getFoo();"を持っています。シングルトンから1つのフィールドだけが必要な場合は、 "foo = Single.getInstance()。getFoo();"のように、これは、長期的な柔軟性を確保するためにはかなり安い値段のようです。 – Jay

0

Use Enum instead of Singleton。それは最も安全な方法です。

+1

あなたはもっと一般的になりますか?あなたの言い訳は間違っています。 – mre

+0

@リトルバニーfoo foo - agree。 @ボリス - 私は私が完全に確信していない。 – AedonEtLIRA

+2

@AedonEtLIRA、@Borisが言っているのは、 'enum'シングルトンパターンが好ましいシングルトン実装であるということです。 – mre

1

はい、静的メソッドと変数のみを使用するのはオブジェクト指向ではありません。 シングルトンは、ほとんどが悪い習慣とみなされます。しかし、私は彼らが時々非常に有用であることを認めます。有効で機能的なシングルトンクラスを作成する方法の簡単な例を次に示します。他の方法があまりにも存在することに留意されたいが、これははい、それは悪いフォームと見なされている最も一般的な...

public class Singleton { 
    private static final Singleton uniqueInstance; 

    public static synchronized Singleton getInstance() { 
    if (Singleton.uniqueInstance == null) { 
     Singleton.uniqueInstance = new Singleton(); 
    } 
    return Singleton.uniqueInstance; 
    } 

    //other methods go here... 

    @Override 
    protected Singleton clone() throws CloneNotSupportedException() { 
    throw new CloneNotSupporedException("cloning of singleton is not supported"); 
    } 

    //hide constructor for others to see 
    private Singleton() { 
    } 
} 

歓声、P

+2

コードの余分な投稿... – mre

+0

ありがとう、しかし、私はシングルトンがどのように行われているのか分かっています。 – AedonEtLIRA

+1

@AedonEtLIRAがどのようにシングルトンを書くのか分からず、静的メソッドでのみ行うのであれば、それはどうして不要ですか? – peshkira

4

の一つです。

Javaの静的クラスには、扱いにくい多くの問題があります。たとえば、インターフェイスを実装することはできません。また、これを通常のシングルトンにする必要がある場合、またはそれを非シングルトンにする必要がある場合は、頻繁に発生します。これは、それと対話するすべてのコード行を書き直す必要があります。

+0

私は経験に基づいて、シングルトン以外のものに変更すると、シングルトンにアクセスする最も一般的な方法からすべての行をリファクタリングする必要があると主張しますMySingleton.getInstance()。someMethod()です。私は残りの部分に争いませんが、その特定の点だけです。 – Robin

0

オブジェクト指向ではないため、悪い書式とみなされます。とにかくシングルトンは貧弱なフォームと考えています。率直に言って、あなたがやろうとしていることはうまくいくでしょう。レビューや評価のためにこれを提示しない限り、私はそれを残しておきます。

パフォーマンスは、静的クラスとしての可能性が高くなります。

+1

個人的に私は「オブジェクト指向ではないので悪い」という議論から決して説得されたことはありません。私の反応は、 "だから何?"何かの正当化が「すべての専門家がそう言っているから」とか「それが教科書のことだから」と言われたら、「私は本当に理由は分かりません」と言います。 – Jay

0

あなたが必要とするすべてのユーティリティクラスであれば、そのがenum

public enum Utility { 
    ; // no instances 
    public static Object myStaticMethod(Object ... args) { } 
} 

を使用していても簡単です、@Boris'はコメントに追加あなたが実装するインタフェースを持っている場合は、このシングルトンは理にかなっています。こんにちは、世界シェアのスーパークラスの呼び出し可能オブジェクトを実際に異なるクラスを持っている:あなたが列挙型で

public enum Callables implements Callable<String> { 
    HELLO { 
     public String call() { return "Hello"; } 
    }, 
    WORLD { 
     public String call() { return "World"; } 
    } 
} 

注意を複数のシングルトンを作成することができ、注意してください。