-3

静的コンストラクターとプライベート コンストラクターの違いは何ですか?

public class WorkstationDevicePresenter
{
    private WorkstationDevicePresenter()
    {}
} 

それらを空白のままにしておくことのポイントは何ですか?

4

4 に答える 4

17

それらを空白のままにするポイントは何ですか?

「空白」のコンストラクターを作成する理由はいくつかあります。

デバッグ中にブレークポイントを設定する場所が必要なため、空のコンストラクターを作成する場合があります。

空の静的コンストラクターを作成すると、静的フィールド初期化子のセマンティクスが変更される可能性があります。詳細については、この件に関する Jon の記事を参照してください。

静的コンストラクターはそのままにして、空のインスタンス コンストラクターを考えてみましょう。

空のコンストラクターを使用する主なルールは次のとおりです。既定では、型にコンストラクターがない場合、"空の" パラメーターなしのパブリック コンストラクターが無料で取得されます。型にコンストラクターがある場合、空のパラメーターなしのパブリック コンストラクターを無料で取得することはできません。

したがって、空のコンストラクターが必要な最初の明白な理由は次のとおりです。空のパラメーターなしのコンストラクターが必要ですが、既に別の ctor を作成しているため、無料で入手することはできません。

2 番目の理由は、ctor がなく、空のパラメーターなしのパブリックコンストラクターが必要ないことです。空のパラメーターなしのプライベート、内部、または保護されたコンストラクターが必要になる場合があります。それが欲しいなら、自分で作らなければなりません。

特に、空のプライベート ctor を唯一の ctor として作成することは、クラスの外部からコンストラクターを介してクラスをインスタンス化できないことを意味します。これは、ファクトリ パターンを使用する場合に非常に便利です。また、派生クラスはコンストラクターを呼び出すことができる必要があるため、クラス外のコードが派生クラスを作成することも防止します。すべてのコンストラクターがプライベートの場合、それらは派生できません。

私はファクトリ パターンでこのバリエーションを頻繁に使用します。

public abstract class Thing
{
  private Thing() {}
  private class RedThing : Thing { ... }
  public static Thing GetRedThing() { return new RedThing(); }
}

プライベート コンストラクターを作成することで、自分のコードでのみインスタンス化でき、自分のコードでのみ拡張できるパブリック抽象クラスを作成できるため、いい不変条件が得られます。から来た。Thing

于 2013-03-27T15:12:11.797 に答える
2

静的コンストラクターは、クラスが読み込まれるときに 1 回発生します。プライベート コンストラクターは、通常、シングルトンの作成に使用される public static メソッドによって、または Builder パターンで呼び出されるときに発生します。空白のプライベート コンストラクターを使用する理由はありません (私が知っていることです)。

于 2013-03-27T14:54:52.227 に答える
1

静的コンストラクターはクラスの静的部分を初期化し、プライベート コンストラクターは、クラスのシングルトン オブジェクトの作成など、クラス自体でのみ使用できます。

public class MyClass {

    private static int staticitem;
    private int instanceitem;

    static MyClass(){
        staticitem = 0; //define value for staticitem
    }

    private MyClass() { //can only be called from within the class
       instanceitem = 0; //define value for instanceitem
    }

    public static MyClass GetMyClass() {
       MyClass m = new MyClass();
       return m;
    }    

}
于 2013-03-27T14:56:32.810 に答える
1

空のプライベート コンストラクターは、それ自体以外によってクラスをインスタンス化できないようにします。このコードがない場合、既定では、コンパイラは空のパブリックパラメーターなしのコンストラクターを作成します。

静的コンストラクターは、静的インスタンスを作成するときに呼び出されます。

たとえば、両方を使用してシングルトン パターンを作成できます。

次のコードを確認してください。

public class Singleton
{
    public static Singleton Instance;
    static Singleton
    {
        Instance = new Singleton();
    }
    private Singleton()
    {
    }
}

public class SomeOtherClass
{
    public static Singleton CompileError = new Singleton();
    public static Singleton CompileOK = Singleton.Instance;
}
于 2013-03-27T14:56:53.190 に答える