2016-03-25 18 views
0

私のアプリケーションでは、シングルトンクラスはほとんど必要ありません。それぞれには、それらを使用する他のシングルトンクラスのいくつかのフィールドがあります。以下は、単純な例で問題を再構築したものです。それぞれのフィールドを含むシングルトンクラスnull参照例外

public sealed class A 
{ 
    private B b = B.Instance; 

    private static readonly A instance = new A(); 
    public static A Instance { get { return instance; } } 
    static A() { } 
    private A() { } 

    public void Do() 
    { 
     b.ToString(); 
    } 
} 

public sealed class B 
{ 
    A a = A.Instance; 

    private static readonly B instance = new B(); 
    public static B Instance { get { return instance; } } 
    static B() { } 
    private B() { } 

    public void Do() 
    { 
     a.ToString(); 
    } 
} 


class Program 
{ 
    static B b = B.Instance; 
    static A a = A.Instance; 

    static void Main(string[] args) 
    { 
     b.Do(); 
     a.Do(); 
    } 
} 

フィールドがnullのため、null参照例外が発生します。だから私はどのように初期化し、そのような相互接続シングルトンクラスを使用できますか?

+1

なぜこのようなクロスですか?依存性は通常、悪い設計の兆候です。 – Thomas

答えて

0

コンストラクタは並行して実行されないため、最初のコンストラクタを作成するときに2番目のシングルトンがまだ作成されていません。

代わりに値にプロパティを設定するので直接あなたはおそらくクラスBにこのような何かを書きたい:

private A AProp { 
    get { 
    if(a == null) 
     a = A.Instance; 

    return a; 
    } 
} 

そんなに値を取得し、クラスAの同じ他の方法でラウンドを行いたいです最初のアクセスまで遅延され、その時点でもう一方のシングルトンはすでに作成されています。

どのようなシナリオでは、まさにこのような何かが良いアイデアは別の質問です。特にローカルフィールドでアクセスする代わりに、常にA.Instanceを使用してアクセスすることができます(ローカルフィールドはその時点で冗長になります)。

関連する問題