[英]How to create a singleton class using enum
我試圖在Java中創建一個單例類。 Java5及以上版本的最佳可用解決方案似乎是使用enum
。 但我不知道如何使用enum
將我的類轉換為單例類。 以下是我的簡化課程:
public class Employee {
private int id;
private String name;
public Employee() {}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
當我在網上搜索答案時,我發現了以下代碼:
public enum EasySingleton{
INSTANCE;
}
但是我的類變量和方法在哪里? 我不知道如何實現這一點。 我知道我們可以提供enum
方法,但我的變量會在哪里? 任何有關這方面的幫助將非常感激。
PS:如果單身人士是邪惡的或反模式,請不要辯論。 我只是想知道如何使用enum
創建一個單例。
類和枚舉之間的差異並不大。 我將第一行代碼更改為public enum
而不是public class
並添加了實例的名稱。
public enum Employee { // changed "class" to "enum"
INSTANCE; // added name of the (single) instance
private int id;
private String name;
Employee() {} // removed "public"
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
請記住,如果你想在一個vm中多次運行你的代碼,singeltons,枚舉實例,靜態事物可能會在以后阻礙你。 考慮在主類中創建Employee
實例並將其傳遞給您的應用程序。
除此之外,枚舉還有一些其他特殊功能:
extend
另一個類(只有implements
) static values()
和getName()
)可用 你的“員工”課程並不是真正應該是單身人士的東西,但是這里有。
public enum Employee {
INSTANCE;
private int id;
private String name;
private Employee() {} //enum constructor must be private
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
那你可以做
Employee.INSTANCE.setName("Hello World!");
(其他答案和評論中討論了單例模式是否適合您的示例使用。我會假裝回答具體問題,即使它實際上可能並不相關。)
Bloch的Effective Java對此進行了很好的討論。 見第17-18頁。 我直接從這個參考文件中掙扎!
基本上,您可以使用枚舉或私有構造函數強制執行單例模式。 Bloch更喜歡前者,盡管它是一種不太常見的模式。
例如:
// Enum singleton
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
功能等同於公共現場方法,並且可以進行序列化而無需更多樣板。 即使面對棘手的反射或序列化訪問,也只會有一個實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.