2012-04-17 44 views
3

所以我確實讀過了什麼以及何時執行靜態initalizer的線索。 Static initializer in Java。但是我遇到了一些別人寫的舊代碼,似乎無法理解他爲什麼會像他那樣使用它。Java靜態初始化器似乎是多餘的

我的班級:

public class ClassA extends Thread { 
    .... private vars .... 

    private static Config config; 

    static { 
    config = null; 
    } 

    public ClassA(Config config) { 
    ClassA.config = config; 
    } 
} 

他爲什麼不只是這樣做?

public class ClassA extends Thread { 
    .... private vars .... 

    private static Config config = null; 

    public ClassA(Config config) { 
    ClassA.config = config; 
    } 
} 

我的理解是靜態initalizer權的構造函數之前和之後得到調用的類被redenered,因此它設置配置=>空,而如果我不使用靜態initalizer,實例變量得到initalizer超。那麼這兩個班級不會做同樣的事情嗎?

回答

5

這些類做同樣的事情,但更復雜的靜態初始化不能總是在一行上完成。

+0

所以可以說我可以使用第二個實現並且不會改變任何功能。 – Churk 2012-04-17 15:21:00

+0

也許該類的作者首先做了一些更復雜的初始化,然後刪除它,然後不刪除靜態初始化器。但這只是一個猜測。無論如何,你的答案是準確無誤的(+1)。 – 2012-04-17 15:21:16

+0

@Churk在這種特殊情況下?是。 – 2012-04-17 15:21:17

3

第一個示例中的靜態初始化器對該類的行爲沒有任何影響。你可以完全刪除它,沒有什麼會改變。

1

爲什麼我寫x = x + 1而不是x++?沒有特別的原因,我只是這樣做的。我認爲這裏是一樣的,因爲2基本相同,並不重要。另一方面,如果將來某個時候需要更復雜的初始化,那麼他可能無法在單行代碼中完成這一操作。

0

無論ClassA有多少個實例,靜態塊只會在加載類時初始化配置一次。

哪個解決方案並不重要,它只是一個技術性問題,我看到有人使用這兩種解決方案。

0

兩者都在做同樣的事情,這是設計選擇的問題。