2011-06-10 59 views
8

我有一組單例類,我想避免樣板代碼。以下是我現在有:繼承的Java單例

public class Mammal { 
    protected Mammal() {} 
} 

public class Cat extends Mammal { 
    static protected Cat instance = null; 
    static public Cat getInstance() { 
     if (null == instance) { 
      instance = new Cat(); 
     } 
     return instance; 
    } 

    private Cat() { 
     // something cat-specific 
    } 
} 

這工作有什麼不妥的,但我有很多Mammal子類必須複製getInstance()方法。如果可能的話,我寧願像這樣的東西:

public class Mammal { 
    protected Mammal() {} 

    static protected Mammal instance = null; 

    static public Mammal getInstance() { 
     if (null == instance) { 
      instance = new Mammal(); 
     } 
     return instance; 
    } 
} 

public class Cat extends Mammal { 
    private Cat() { 
     // something cat-specific 
    } 
} 

我該怎麼做?

+1

你單身getInstance()方法是不是正確實施 - 在多線程環境中,你可以最終創建多個實例! – Liv 2011-06-10 15:58:29

+1

不是你的問題的答案,但你的單身模式不是線程安全的。有[Java併發實踐]中的示例(http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601)。 – Bruno 2011-06-10 16:00:40

+0

單身真的是最好的方法嗎?單身人士最好用來表示服務或其他真實世界中只有一個實例的東西。確保這種模式非常適合你的應用領域,因爲我會假設你的代碼並不真正使用貓和狗。如果單身人士合適,我建議使用Jim Garrison的使用Spring的解決方案;春季豆類默認爲單身。 – 2011-06-10 16:56:45

回答

3

你不能因爲構造函數既不被繼承也不能被覆蓋。你想要的例子中的new Mammal()只創建一個Mammal,而不是它的一個子類。我建議你看看工廠模式,或者去看看Spring這樣的東西,它只是針對這種情況。

2

您可以使用enum來創建單身人士。

public enum Mammal { 
    Cat { 
     // put custom fields and methods here 
    } 
} 
0

使您的構造函數爲私有,這將阻止您的類被其他類繼承。

或者要創建一個單獨的最好方法是用一個枚舉創建類的枚舉(喬什塊)