簡體   English   中英

如何使用枚舉創建單例類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM