2012-04-09 27 views
0

我有一個在我的基類之一上創建的單例對象。軟件設計,可讀性問題,靜態與實例方法

public class SomeClass 
{ 
    private static final MySingletonClass _singletonObject = new MySingletonClass() 

    protected final getSingletonObject() 
    { 
     return _singleonObject; 
    } 
} 

我還沒決定是否應該使方法變爲靜態。我的設計思想說這個方法應該是靜態的,因爲對象是靜態的,但我的「用戶」頭腦說這個方法應該是一個實例,因爲這個對象的使用只有在派生類成員中訪問時纔有意義。

public class SomeDerivedClass extends SomeClass 
{ 

    public void someMethod() 
    { 
    // If static can be used SomeClass.getSingletonObject() 
    getSingletonObject(); 
    } 
} 

的使用是完全一樣的唯一的視覺差異的方式,在IDE中對待靜態和實例方法,我的問題通過不顯著。

回答

0

要做到這一點的更好方法如下所示。辛格爾頓可以通過類本身而不是其他類這樣做,因爲它被強制執行(除非您使用的是DI容器像在這種情況下,你讓春春的管理,對你)

MySingletonClass.getInstance().doStuff() 

基於評論編輯

聲明如下,你的所有子類都共享相同的實例。

public class SomeClass 
{ 
    public static final MySingletonClass INSTANCE = new MySingletonClass() 
} 

並像下面那樣訪問它,即在你的子類中使用超類名作爲限定符。記住靜態實例永遠不會被繼承...

public class SomeDerivedClass extends SomeClass 
{ 
    public void someMethod() 
    { 
    SomeClass.INSTANCE.doStuff() 
    } 
} 
+0

這並不能解決我的問題,因爲我不想公開所有類的實例,只是爲了SomeClass的子類。 – DVD 2012-04-09 19:23:10

+0

然後它不應該是靜態的,只是使它最終。 – 2012-04-09 19:25:53

+0

但我想要多個派生類實例共享的對象xD – DVD 2012-04-09 19:33:47

0

你必須記住單例類的構造函數是私有的! 所以,你不能直接從Singleton類創建一個對象。 請參閱下面的代碼,這將滿足你的問題:

public class MySingletonClass { 

    //static variable for the singleton instance in tracked here 
    private static MySingletonClass instance = null; 

    private MySingletonClass() { 

    } 

    public static synchronized MySingletonClass getInstance() { 
     if(null == instance) { 
      instance = new MySingletonClass(); 
     } 

     return instance; 
    } 
} 

public class SomeClass { 
    //Already static instance is instance is tracked in MySingletonClass, no need of declaring a static variable here 
    //private static final MySingletonClass _singletonObject = new MySingletonClass() 

    protected final MySingletonClass getSingletonObject() 
    { 
     //This will return the static instance of the MySingletonClass class. 
     return MySingletonClass.getInstance(); 
    } 
} 

請讓我知道你是否需要更詳細地回答。