2012-10-19 137 views
1

在我的編碼中,我使用Singleton類與Singleton Design Pattern。問題是爲什麼它的子類不允許使用默認構造函數?Singleton設計模式及其子類的默認構造函數

我得到編譯時錯誤:

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; 
    } 

} 

SubClass.java

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

如果你繼承一個單例類,它不再是單例類。你這樣做是錯的。 –

+0

我只想知道.. – CycDemo

+0

您無法創建編譯子類的原因是因爲單例設計模式故意使其無法繼承子類。這就是隻有私人構造函數。 –

回答

6

當您創建的​​實例那麼它會自動調用的初始化它的字段,並進一步調用所有的超類構造函數inheritance hierarchy

現在因爲你的SuperClass構造函數是私有的,所以它不能調用它。所以,你得到的例外..

但它沒有任何意義,subclass a singleton類,因爲在那種情況下,your class will no longer be singleton

您應該re-think關於您的design以及您正在嘗試做什麼。並相應地設計你的設計。

1

因爲你Singleton類無參數的構造函數是private。當你實例化子類時,它也嘗試實例化超類。但是你的超類擁有私有構造函數。它失敗。

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

將子類Singleton分類是沒有意義的。您可能需要重新考慮您的設計。

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"); 
} 
1

首先,繼承一個單獨的類被打破Singleton Pattern. 基本其次,由於通過調用繼承樹的構造函數鏈中,你得到的異常,因爲父類的構造函數是private

您可能會添加一個帶有一些參數的公共構造函數,以使子項從其父項繼承。那麼你可能會有很多​​的實例。任何Subclass實例IS-ASingleton實例。這是違背Singleton模式的目的。這就是爲什麼你應該避免子類化單例類。