2013-03-27 123 views
0

我有一個實用工具類,看起來像這樣:靜態塊永遠不會運行

public final class MyUtils { 

    public static final List<String> MY_VALUES = new ArrayList<String>(); 

    { 
     MY_VALUES.add("foo"); 
     MY_VALUES.add("bar"); 
    } 
} 

我把這個從另一個類就像這樣:

MyUtils.MY_VALUES 

如果我這樣做,名單空,如果我調試我看到靜態塊永遠不會運行。

據我所知,從When does static class initialization happen?How to force a class to be initialised?的答案我應該馬上做a static field of the class is assigned。我也嘗試使可變非最終符合條件「a non-constant static field is used」。

我可以使用初始化方法,也可以在其他兩個問題中獲得,也可以在Why doesn't my static block of code execute?中使用,但我仍然想理解它爲什麼不起作用,儘管我似乎已經完成了語言的條件規範。

回答

8

您必須添加static關鍵字在你擋在前面,以使其靜:

public final class MyUtils { 

    public static final List<String> MY_VALUES = new ArrayList<String>(); 

    static { 
     MY_VALUES.add("foo"); 
     MY_VALUES.add("bar"); 
    } 
} 

一個初始化塊被稱爲每次類構造。

A 靜態初始化塊在程序開始時只被調用一次。

+0

工作,謝謝。將是幾分鐘,直到我可以接受你的答案。你能解釋一下沒有'static'關鍵字的結構有什麼區別嗎?我之前使用過,它一直工作到目前爲止(例如,如果我調用靜態方法,塊之前運行)。 – 2013-03-27 01:13:33

+0

看到我上面編輯的答案 – 2013-03-27 01:19:03

+0

真棒提示,thx – Jason 2013-03-27 01:27:17