[英]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
構造函數是私有的,因此它無法調用它。 因此,您將收到該異常。
但是將singleton
類subclass
是沒有意義的,因為在這種情況下, 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.