2014-03-26 27 views
1

單讓我們假設我們有基礎類:的Java:從基類

public class Base { 
     public Base(int i) { 
     /* ... */ 
     } 
     /* ... */ 
} 

我們希望在此基礎上類來創建單。問題是,有類公共構造,所以擴展它會導致單身有公共的構造,太:

public class SingletonBase extends Base { 
    private static final SingletonBase _instance = new SingletonBase(); 

    private SingletonBase() { 
     super(0); 
    } 

    public SingletonBase(int i) { // Want to avoid this! 
    super(i) 
    } 

    public static void getInstance() { 
    return _instance; 
    } 
    /* ... */  
} 

辛格爾頓,當然不能有公共構造函數,所以我們要避免這種情況。 那麼,什麼是最優雅的方式/模式具有合適的Singleton功能從基類?

編輯:修改基類是禁止的,因爲它來自外部庫。

+3

只是聲明「SingletonBase」的所有構造函數都是私有的 – kiruwka

+0

忘了提及,我無法修改基類 - 它來自外部庫。 – Kao

+0

但SingletonBase只能有一個構造函數...只需刪除公共的一個和voilla。爲什麼你在地球上使用單例的抽象?如果你想重用框架代碼,只需使用單例內的Base對象。 – Gaskoin

回答

4

構造函數不被繼承。所以只需
刪除這部分,你會得到你所需要的。

public SingletonBase(int i) { // Want to avoid this! 
    super(i) 
} 

此外,您可能希望使Base
抽象,以便沒有人可以錯
通過直接調用構造函數Base實例化它。

public abstract class Base { 
    public Base(int i) { 
     /* ... */ 
    } 
    /* ... */ 
} 

public class SingletonBase extends Base { 
    private static final SingletonBase _instance = new SingletonBase(); 

    private SingletonBase() { 
     super(0); 
    } 

    public static SingletonBase getInstance() { 
     return _instance; 
    } 
    /* ... */ 
} 
+0

是的,我不知道爲什麼我認爲構造函數是繼承的。謝謝! – Kao

+0

我投票了,因爲如果你刪除(或更好的詞:省略)在子類中的構造函數,超類的構造函數仍將被調用。 –

+1

@ScottShipp我認爲你沒有在這裏得到問題的背景。 –

0

你可以做SingletonBase只是一個普通的子類,並委託辛格爾頓部分以不同的類。 我不知道你的具體情況是什麼,但你會有Subclass extends Base和其他地方你會有你的SingletonContainer或類似的東西,你有方法public static Subclass getInstance()

這樣,您將擁有通常的繼承和Singleton效應,因爲SingletonContainer將僅負責保留Subclass的單​​個實例。

0

這不是因爲你有,你必須創建相同的公共構造公共構造函數的類繼承,你可以這樣做:

public class SingletonBase extends Base { 
    private static final SingletonBase _instance = new SingletonBase(); 

    private SingletonBase() { 
     super(0); 
    } 

    public static void getInstance() { 
    return _instance; 
    } 
    /* ... */  
} 

甚至:

public class SingletonBase extends Base { 
    private static final SingletonBase _instance = new SingletonBase(); 

    private SingletonBase() { 
     super(0); 
    } 

    private SingletonBase(int i) { // Want to avoid this! 
    super(i) 
    } 

    public static void getInstance() { 
    return _instance; 
    } 
    /* ... */  
}