2014-02-22 126 views
2

實例化我有一個學校的任務,我必須在某個給定的項目中發現模式。一切都很好(相對而言),但似乎我發現的大多數模式都是某種變化。我必須找到的單身人士也不例外。單身人士用這個

代碼如下。關於這個奇怪的是,這個類似乎並沒有與下面的構造函數來實例化,正如人們所預料:

public Singleton() { 
    if (singleton == null) { 
     singleton = new Singleton(); 
    } 
} 

但是,instatiated與this(你可以在下面的原代碼中看到)?根據我的理解,這會創建某種靜態單例?我調試,看到確實第一次構造函數被稱爲

Singleton x = new Singleton(); 
     x.Print(); 

,它確實爲空。而this是一個Singleton實例。但是,不應該存在

private static Singleton singleton = new Singleton(); 

而不是singelton = this;

public class Singleton { 

    private static Singleton singleton; 

    public static Singleton getDefault() { 
     return singleton; 
    } 

    /** 
    * The constructor. 
    */ 
    public Singleton() { 
     if (singleton == null) { 
      singleton = this; 
     } 
    } 

    public void Print() 
    { 
     System.out.println("I'm a singleton!"); 
    } 

} 

我敢肯定,這確實是一個單身,這只是我從來沒有見過的類型,我不明白背後的原因,那就是我basicly問。

+0

重點不在於修改代碼;關鍵是要報告爲什麼這是一個單身人士。這顯然是一個單身人士,但我很困惑這是如何用''this'實現的。 –

+0

您在調用構造函數的那一刻創建了實例,因此'this'指向您的實例(通常會使用例如'this.name = name'將成員變量的值賦給它們)。由於單身人士尚未初始化,它將是'空',你可以分配你的實例。之後,進一步的初始化當然有'singleton!= null',所以不會有新的賦值。 然而,這種方式並不真正乾淨,因爲調用Singleton.getDefault()。Print();'會導致nullPointerException。 –

+3

它根本不是單身人士,因爲任何人都可以調用構造函數並獲得新實例。這是糟糕的代碼,沒有別的。當然不是設計模式。沒有任何意義。我真的希望老師的意圖是讓你發現這個代碼的蹩腳性,而不是讓你相信它實際上是一個單身人士。 –

回答

0

您的代碼有不是跟着Singleton模式。我在Singleton模式下面展示了一個類。 this引用當前對象實例。當你初始化this內部構造的單身參考,它調用默認(無參數)構造函數併爲其分配回this參考,然後將其分配給singleton類的成員變量

public class Singleton { 

    private static Singleton singleton; 

    public static Singleton getDefault() { 
     if (singleton == null) 
      singleton = new Singleton(); 
     return singleton; 
    } 

    /** 
    * The constructor. 
    */ 
    private Singleton() { 
     System.out.println(singleton); 
     if (singleton == null) { 
       /*this will call a default constructor 
       *and instantiate Singleton object 
       */ 
      singleton = this; 
     } 
    } 

    public void Print() { 
     System.out.println("I'm a singleton!"); 
    } 


    public static void main(String[] args) { 
     Singleton singleton = Singleton.getDefault(); 
     System.out.println(singleton.Print()); 
    } 
} 

希望您能理解!

0

我想你是混淆的意思或thisthis未實例化類,this引用新創建的實例。然後,無論您是否存儲在private static Singleton singleton;中,無論何時有人調用構造函數,都會創建一個新實例(並返回)。

還有說@ dic19你必須讓你的構造函數private阻止多個實例存在。

如果不是像你說的那樣修改代碼,那麼關鍵是要報告這個類不是單例。

您可以檢查調試:

Singleton x = new Singleton(); 
    Singleton x1 = new Singleton(); 
    Singleton x2 = new Singleton(); 

你會看到三個不同的情況下,是Singleton.getDefault()乾脆先創建。

0

如果我們使用singletone我們不需要創建使用的實例。因爲當我們創建singletone時,如果未創建,我們將創建new instance。 看看下面的代碼:

public class Singleton { 
    private static Singleton singleton; 

    private Singleton() { 
    } 

    public static Singleton getSingleton() { 
     if (singleton == null) { 
      singleton = new Singleton(); 
     } 
     return singleton; 
    } 

    public void testSingleTone(){ 
     System.out.println("test"); 
    } 

    public static void main(String[] args){ 
     Singleton.getSingleton().testSingleTone(); 
    } 
} 
1

一般有兩種方法可以創建一個單獨的類,兩者都基於保持構造私有。
第一種方法:

public class Singleton 
{ 
    public static final Singleton INSTANCE = new Singleton(); 

    private Singleton{...} 
} 

您創建這樣一個實例:辛格爾頓單= Singleton.INSTANCE;

第二種方法:

public class Singleton 
{ 
    private static final Singleton INSTANCE = new Singleton(); 

    private Singleton(){...} 

    public static Singleton getInstance(){ return INSTANCE; } 

} 

在這種情況下,可以創建這樣一個實例:Singleton單= Singleton.getInstance(); getInstance()方法然後被視爲公共工廠方法。

正如您所看到的,在這兩種情況下,new關鍵字肯定用於創建該類的單個實例,但由於使用了該模式,因此只能有一個實例,不能再有更多。您不需要使用「this」關鍵字。 希望這有助於。