2012-01-24 51 views
7

我有兩個類:麻煩靜態場和辛格爾頓

public class Singleton{ 
    private Singleton(){...} 

    private static class InstanceHolder{ 
     private static final Singleton instance=new Singleton(); 
    } 

    public static Singleton getInstance(){ 
     return InstanceHolder.instance; 
    } 
} 

public class Someclass{ 
    private static final Singleton singleton=Singleton.getInstance(); 

    public static Singleton getSingleton(){ 
     return singleton; 
    } 
} 

問題

如果某個地方(實際上,在另一個單類的構造函數)我用像這樣:

private final Singleton singleton=Someclass.getSingleton(); 

singleton總是空

問題爲什麼呢?

+0

如果您在構造函數之外執行它,它會工作嗎? – Vadim

回答

8

您的示例工作正常,因此它不完整。

也許在你的實際應用中,你有你的類之間的dependecy週期,使getSingleton()完成的Someclass初始化之前被調用,類似於以下,但涉及多個類別:

public class Foo { 
    private static Foo INSTANCE = new Foo(); // Prints null 
    private static String s = "foo"; 

    public Foo() { 
     System.out.println(s); 
    } 
} 

這是特別如果你有這種方式實現了多個相互依賴的單身人士,那很可能。 嘗試找到並消除這些週期。

此外,也許最好是使用某種DI或服務定位器模式,而不是手動實現單例行爲。

1

您應該在第一次調用getInstance()而不是靜態時創建單例實例。無論依賴週期如何,這都可以工作。

public class Singleton { 
    private static Singleton instance = null; 

    private Singleton(){...} 

    public static Singleton getInstance() { 
    if(instance == null) { 
     instance = new Singleton(); 
    } 
    return instance; 
    } 
} 
+0

在'Singleton'類作者已經使用靜態持有人慣用法。問題在於其他課程。 – axtavt

+0

但是實例是在原始帖子中靜態創建的。在我的建議中不是。這確保實例在所有靜態初始化之後創建。 (除非'private static Singleton s = Singleton.getInstance()'在某處 – tobiasbayer

+1

我認爲讓getInstance同步更好。 –