2012-01-12 98 views

回答

1

我看到它的方式,如果您認爲單例實現使用對單個實例的引用static,則只有「無語義差異」。事情是,static只是實現單例的一種方式 - 它是一個實現細節。 You can implement singletons other ways, too.

+0

嗨,萬一我沒有提到持有單身本身的實例,但其他普通數據成員的變量是否有私人實例和私人靜態之間的任何區別? – 2012-01-12 00:59:39

0

雖然有差異。例如,您不能使用靜態塊來初始化前者。

+0

該OP特別提到了「語義差異」 - 顯然,有(非?)語義差異,就像一個是靜態的,另一個不是...... – 2012-01-12 00:43:53

+0

當然可以。'static {instance = new Singleton(); }'。 – cHao 2012-01-12 00:44:54

+0

我認爲「前者」是指實例變量。 – 2012-01-12 00:46:38

-1

也許最好是在單例中實現它,因爲這樣你可以重寫單例測試和類似的。此外,你保持你的靜態在一個地方。

1

真的沒有區別(除了已經提到的初始化塊)。但另一方面,你也沒有真正獲得任何東西。您仍然需要考慮線程安全性,您仍然需要確保一次只有一個單例實例。唯一的區別是如果你想通過公共靜態方法發佈該成員。但爲什麼你要這樣做 - 我不知道。

對我個人而言,它也會有點「代碼味道」。我的意思是有人做了一個單身人士,並且仍然將其成員聲明爲靜態?它告訴我什麼?有什麼我不知道的嗎?或者也許執行有問題,它必須是靜態的(但爲什麼?!)。但我有點偏執。從我也意識到沒有性能的原因,爲什麼這將是一個很好的選擇。

1

我不確定你在找什麼,所以我會寫點東西,看看你有什麼要說的。

public class Elvis { 
    private static final Elvis INSTANCE = new Elvis(); 
    private double weight; // in pounds 

    private Elvis() { weight = 300.; } // inaccessible 

    public static Elvis getInstance() { return INSTANCE; } 

    public double getWeight() { return weight; } 
    public void setWeight(double weight) { this.weight = weight; } 
} 

由於只有一個貓王,你可以做出weight一個靜態變量(靜態getter和setter)。如果你把所有的變量靜態的,那麼就定義一個Singleton實例,因爲你只是有一個類只有靜態變量和方法沒有一點:

public class Elvis { 
    private static double weight; // in pounds 
    static { weight = 300.; } // Could just have set the weight directly above, 
       // but a static block might be useful for more complex examples. 

    public static double getWeight() { return weight; } 
    public static void setWeight(double weight) { this.weight = weight; } 
} 

我想這應該避免的,因爲它看起來更像一個標題C文件比OO文件。

有些人可能已經認識到J. Bloch的「Effective Java」中的Elvis參考文獻。在這本書中的建議是使用一個成員來實現與枚舉單件模式:

public enum Elvis { 
    INSTANCE; 

    private double weight = 300.; 

    public double getWeight() { return weight; } 
    public void setWeight(double weight) { this.weight = weigth; } 
} 

注意,它看起來有點非標準這裏與不同體重,因爲你通常期望枚舉實例是不可變的。

+0

我也讀過Josh Bloch這本書的這部分,你最喜歡什麼,私人靜態重量還是私人重量? :D – 2012-01-12 04:15:41

+0

正如我所說的,我不喜歡只有靜態成員變量和函數的類,所以我會使用非靜態的。看到然而,[這stackoverflow post](http://stackoverflow.com/questions/1942903/)大多數人說,它可能不是面向對象,一切都靜態,但它不是一個問題。 – toto2 2012-01-12 12:56:12

+0

所以我想這取決於你的班級實際上在做什麼。 – toto2 2012-01-12 13:02:31