免費

5

在對雙重檢查鎖定成語的article延遲初始化,我發現這句話:延遲初始化,做工作按預期不同步是靜態單的免費

一種特殊情況。當被初始化的對象是這個類的靜態字段沒有其他方法或字段時,JVM自動有效地執行延遲初始化。

爲什麼強調的部分很重要?如果其他方法或字段,爲什麼它不工作?

(文章已經超過10歲。是信息還有用嗎?)

+0

+1有趣的問題。最初,我的猜測是,那是JVM能夠確信在該類從外部引用之前不會有對該對象的調用的唯一時間;但這似乎並不能說明任何事情。 –

回答

4

它的意思大概是說,如果一個類沒有其他方法或字段,那麼你只能訪問它的單身人士,所以單身人士只在需要時才創建。否則,例如,

class Foo 
{ 
    public static final Foo foo = new Foo(); 

    public static int x() { return 0; } 
} 

class AnotherClass 
{ 
    void test() 
    { 
     print(Foo.x()); 
    } 
} 

這裏,foo被實例化,雖然它從來沒有被要求。

但是可以使用私有靜態方法/域,所以其他人不會意外觸發類初始化。

+0

*「沒有其他方法或字段的類的靜態字段」* - 但在您的示例中,Foo **具有**方法x() – mantrid

+0

是的,因爲他在文章中給出了案例的反例,單身人士並不是很懶,因爲它可能在需要之前創建。 – BeeOnRope

+0

好吧,但是在Singleton實現中,通常只有一個靜態方法返回實例,而其他所有方法都是非靜態的,對嗎? – fredoverflow