簡體   English   中英

單身人士 - 正確的方式

[英]Singleton – the proper way

public enum YourSingleton {
    INSTANCE;

    public void doStuff(String stuff) {
        System.out.println("Doing " + stuff);
    }
}

YourSingleton.INSTANCE.doStuff("some stuff");

這是最初的鏈接, http://electrotek.wordpress.com/2008/08/06/singleton-in-java-the-proper-way/

我在問為什么我們可以在Java中以這種方式調用函數doStuff。

在Java中, enum可以完成class所能做的所有事情[1] YourSingleton.INSTANCE創建的實例YourSingleton ,這樣,那么你可以調用方法就好像它是一個普通class的實例,它基本上是。

有關枚舉類型的更深入討論,請參閱官方Java文檔: http//download.oracle.com/javase/tutorial/java/javaOO/enum.html

[1] enum沒有實際的繼承實現。 由於所有enum類型隱含繼承java.lang.Enum並且Java不支持多繼承,因此您無法擴展其他任何內容。

傳統的實現單例的方法很好,但是要將其狀態保持為真正的單例,它需要保護自己免受復雜的序列化和反射攻擊。 這樣做的一般方法是使類實現Serializable,使所有實例字段Transient並實現readResolve方法。 (返回相同的單例實例)。

Enum Singleton模式提供開箱即用的所有這些功能。 但主要原因是,我喜歡Enum變體是它的可讀性。 根據我的說法,它以比傳統單身人士更簡潔的方式傳達它所做的事情。(你不必向新開發者解釋,所有涉及序列化的變幻莫測以及序列化如何打破單身保證以及為什么你需要readResolve方法等等。)

我知道這不是你要求的,但是當我需要一個單身成為一個單身時,這就是我所做的,這可能有所幫助。 我創建了一個靜態getInstance方法,該方法創建並返回該類的新實例(如果不存在)或者返回其自身的現有引用,並且我將此類的構造函數設為private。

例如:

public class NameOfClass{
    private static NameOfClass variableReferencingThisClass=new NameOfThisClass();

    private NameOfClass(){}

    public static NameOfClass getInstance(){
        return variableReferencingThisClass;
    }
}

您還可以使用雙鎖單例創建。 假設該類是MyObject ,具有private構造函數,並且聲明了一個static字段instance為null。 然而,這並不能保證2個單身人士最終不會被創造出來,而是比單一檢查更接近線程安全的嘗試。

public static MyObject getInstance()
{
  if (instance == null)
  {
    synchronized(MyObject.class) {  
      if (instance == null)          
        instance = new MyObject(); 
    }
  }
  return instance;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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