簡體   English   中英

Singleton設計模式及其子類的默認構造函數

[英]Singleton Design Pattern and its child class's default constructor

在我的編碼中,我將Singleton類與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;
    }

}

子類

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

當您創建的實例SubClass ,然后它會自動調用constructor它的SuperClass初始化其領域,並進一步調用所有超構造函數在inheritance hierarchy

現在,由於您的SuperClass構造函數是私有的,因此它無法調用它。 因此,您將收到該異常。

但是將singletonsubclass是沒有意義的,因為在這種情況下, your class will no longer be singleton

您應該re-think您的design以及您想做的事情。 並相應地change設計。

不應該繼承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");
}

因為您的Singleton類no-arg構造函數是private 當實例化子類時,它也會嘗試實例化超類。 但是您的超類具有私有構造函數。 它失敗。

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

子類化Singleton類沒有任何意義。 您可能需要重新考慮您的設計。

首先,單例類的子類化打破了Singleton Pattern.的基礎Singleton Pattern. 其次,由於通過繼承樹調用構造函數的鏈條,您將獲得該異常,因為父類的構造函數是private

您可能會添加帶有一些參數的公共構造函數,以使子代從其父代繼承。 然后,您可能會有許多SubClass實例。 任何Subclass實例都是IS-A Singleton實例。 這與Singleton模式的目的背道而馳。 這就是為什么應該避免子類化單例類的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM