2014-12-08 61 views
3

任何人都可以解釋如何在以下單例模式代碼中進行延遲初始化嗎?在Singleton中如何進行延遲初始化?

public class Singleton 
{ 
    private static Singleton INSTANCE = null; 
    private Singleton() {} 
    public static Singleton getInstance() 
    { 
    if (INSTANCE == null) 
     INSTANCE = new Singleton(); 
    return INSTANCE; 
    } 
} 
+1

從[維基百科關於延遲初始化(http://en.wikipedia.org/wiki/Lazy_initialization):「[...]延遲初始化是_delaying_的策略創建一個對象[的。 ..]「 – Seelenvirtuose 2014-12-08 09:47:37

+0

沒關係....... – Scooter 2014-12-08 09:49:11

+1

有關執行延遲初始化的好方法,請參閱[有關Scala如何執行此操作的問題](https://stackoverflow.com/questions/17642275/how-are -lazy-VAL-類變量實現的功能於斯卡拉-2-10)。 – 2014-12-08 09:49:27

回答

7

首次getInstance()叫,INSTANCE是空的,它與INSTANCE = new Singleton();初始化。這具有如果從未使用過的情況下不初始化實例的優點。

如果可以通過多個線程訪問此代碼,則應該將其改進爲線程安全。

+2

'public enum Singleton { INSTANCE; public void method(){ ... } }' 這是如何使線程安全的單例(Thx Joshua Bloch)的最佳方式, – Milkmaid 2014-12-08 09:53:30

1

懶惰表示該實例初次使用時初始化。

這裏是一個渴望的例子,它在使用之前被初始化。

public class Singleton 
{ 
    private static Singleton INSTANCE = new Singleton(); 
    private Singleton() {} 
    public static Singleton getInstance() 
    { 
    return INSTANCE; 
    } 
} 
1

的實例被創建當類初始化,只有當你調用getInstance類被初始化。

你可能想要訪問的JLS - 12.4.1. When Initialization Occurs

類或接口類型T將立即以下的任何一個的 第一次出現之前對其進行初始化:

T是一個類並創建一個T的實例。

T是一個類,由T聲明的靜態方法被調用。

指定由T聲明的靜態字段。

使用由T聲明的靜態字段,該字段不是常量 變量(§4.12.4)。

T是頂級類(第7.6節),並且在T(§8.1.3)中執行詞法嵌套的斷言語句(§14.10) 。