1

私のコーディングでは、Singletonclass withを使用しSingleton Design Patternます。そのサブクラスがデフォルトのコンストラクターの使用を許可されていないのはなぜですか?

コンパイル時エラーが発生します:

Implicit super constructor Singleton() is not visible. Must explicitly invoke another constructor

Singleton.java

public class Singleton {
    private static Singleton singleton;

    private Singleton() {
        System.out.println("I am user class");
    }

    public static Singleton getInstance() {
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

}

サブクラス.java

public class SubClass extends Singleton {
    public SubClass(){
        System.out.println("I am sub class");
    }
}
4

4 に答える 4

6

のインスタンスを作成すると、 のSubClassが自動的に呼び出されてconstructorそのSuperClassフィールドが初期化され、さらに のすべてのスーパークラス コンストラクターが呼び出されます。inheritance hierarchy

コンストラクSuperClassターはプライベートであるため、それを呼び出すことはできません。だから、あなたはその例外を取得しています..

subclassしかし、singletonクラスにとっては意味がありませんyour class will no longer be singleton

あなたはre-thinkあなたdesignとあなたがやろうとしていることについてすべきです。そしてchangeそれに応じてあなたのデザイン。

于 2012-10-19T17:42:26.190 に答える
2

SingleTon クラスは継承されることが想定されていないため、以下で確実に

private Singleton() {

以下のコード

public SubClass(){
    System.out.println("I am sub class");
}

と同じです:

public SubClass(){
    super(); //Error here as super class constructor is private
    System.out.println("I am sub class");
}
于 2012-10-19T17:41:44.780 に答える
1

まず第一に、シングルトン クラスのサブクラス化は の基本を壊していますSingleton Pattern. 第二に、継承ツリーを介してコンストラクターを呼び出すチェーンにより、親クラスのコンストラクターが であるため、その例外が発生しますprivate

おそらく、いくつかのパラメーターを持つパブリック コンストラクターを追加して、子がその親から継承されるようにします。次に、おそらく多くのインスタンスがありSubClassます。どのSubclassインスタンスも、 IS-A Singletonインスタンスです。そして、これは Singleton パターンの目的に反しています。そのため、シングルトン クラスのサブクラス化は避ける必要があります。

于 2012-10-19T17:45:27.283 に答える
1

あなたのSingletonクラスの引数のないコンストラクターはprivate. サブクラスをインスタンス化すると、スーパークラスもインスタンス化しようとします。ただし、スーパークラスにはプライベートコンストラクターがあります。失敗します。

 private Singleton() {
        System.out.println("I am user class");
    }

クラスをサブクラス化しても意味がありませんSingleton。設計を再考する必要があるかもしれません。

于 2012-10-19T17:41:41.353 に答える