回答
我看到它的方式,如果您認爲單例實現使用對單個實例的引用static
,則只有「無語義差異」。事情是,static
只是實現單例的一種方式 - 它是一個實現細節。 You can implement singletons other ways, too.
雖然有差異。例如,您不能使用靜態塊來初始化前者。
該OP特別提到了「語義差異」 - 顯然,有(非?)語義差異,就像一個是靜態的,另一個不是...... – 2012-01-12 00:43:53
當然可以。'static {instance = new Singleton(); }'。 – cHao 2012-01-12 00:44:54
我認爲「前者」是指實例變量。 – 2012-01-12 00:46:38
也許最好是在單例中實現它,因爲這樣你可以重寫單例測試和類似的。此外,你保持你的靜態在一個地方。
真的沒有區別(除了已經提到的初始化塊)。但另一方面,你也沒有真正獲得任何東西。您仍然需要考慮線程安全性,您仍然需要確保一次只有一個單例實例。唯一的區別是如果你想通過公共靜態方法發佈該成員。但爲什麼你要這樣做 - 我不知道。
對我個人而言,它也會有點「代碼味道」。我的意思是有人做了一個單身人士,並且仍然將其成員聲明爲靜態?它告訴我什麼?有什麼我不知道的嗎?或者也許執行有問題,它必須是靜態的(但爲什麼?!)。但我有點偏執。從我也意識到沒有性能的原因,爲什麼這將是一個很好的選擇。
我不確定你在找什麼,所以我會寫點東西,看看你有什麼要說的。
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; }
}
注意,它看起來有點非標準這裏與不同體重,因爲你通常期望枚舉實例是不可變的。
- 1. 私有實例變量/類定義
- 2. 繼承和私有實例變量
- 3. 在C#中繼承的私有靜態和實例變量以及爲什麼?
- 4. php中的私有靜態變量類
- 5. 私有靜態實例變量和繼承
- 6. 靜態私有變量
- 7. 私有靜態變量
- 8. 非靜態私有變量
- 9. C#私有變量&java私有變量getter&setter - 區別?
- 10. 如何在main()中訪問私有靜態實例變量
- 11. 類變量和類實例有什麼區別?
- 12. Objective-C私有實例變量定義
- 13. 修改私有實例變量
- 14. Tcl:在類中設置自有實例的私有變量
- 15. 公共和私有變量有什麼區別
- 16. 結構中的私有靜態變量
- 17. 靜態變量和全局變量(Java)有什麼區別?
- 18. PDO和私有類變量
- 19. 類和私有變量
- 20. 派生類中的實例變量與超類的私有實例變量具有相同的名稱?
- 21. 誤差的私有靜態變量
- 22. 爲什麼建議將實例變量聲明爲私有?
- 23. Java中的本地變量和實例變量有什麼區別
- 24. Javascript私人實例變量?
- 25. TypeScript - 私有變量和受保護變量之間的區別
- 26. 私有變量
- 27. C++私有靜態成員變量
- 28. 屬性和實例變量有什麼區別?
- 29. 屬性和實例變量有什麼區別?
- 30. java/oops中的靜態變量和動態變量有什麼區別?
嗨,萬一我沒有提到持有單身本身的實例,但其他普通數據成員的變量是否有私人實例和私人靜態之間的任何區別? – 2012-01-12 00:59:39