在審查一些舊的代碼,我發現了一些相當奇怪的語法,我以前從未見過。在做了一些研究之後,我現在知道我看到的是一個static{}
塊(如果我理解正確的話)是在初始化時執行的代碼塊。
我不明白的是擁有這樣一個功能的好處,或者當人們可能想要使用它時。看起來靜態塊只包含普通的代碼行,它可以屬於任何常規的靜態方法,所以在初始化時自動運行有什麼好處(除了保存程序員一行代碼來調用方法) ?爲什麼這很重要或有用?
在審查一些舊的代碼,我發現了一些相當奇怪的語法,我以前從未見過。在做了一些研究之後,我現在知道我看到的是一個static{}
塊(如果我理解正確的話)是在初始化時執行的代碼塊。
我不明白的是擁有這樣一個功能的好處,或者當人們可能想要使用它時。看起來靜態塊只包含普通的代碼行,它可以屬於任何常規的靜態方法,所以在初始化時自動運行有什麼好處(除了保存程序員一行代碼來調用方法) ?爲什麼這很重要或有用?
正如你所說,靜態塊在初始化時執行。 說你有一個靜態字段,它可以是相當複雜的,例如
private static List<ThingsDownloadedByTheNet> ls;
只是做
private static List<ThingsDownloadedByTheNet> ls = new ArrayList<ThingsDownloadedByTheNet>
可能是不夠的,因爲你也許要設置列表元素了。 所以,你做一個靜態塊,在其中執行一些初始化(在這種情況下,你連接到服務器並填充列表元素)
把它看作靜態變量的構造函數。它讓你有機會在任何人使用它們之前初始化它們。
當他們在Java Tutorials說:
如果初始化需要一些邏輯(例如,錯誤處理或一個for循環填充複雜的陣列),簡單的賦值是不夠的。實例變量可以在構造函數中初始化,其中可以使用錯誤處理或其他邏輯。爲了爲類變量提供相同的功能,Java編程語言包括靜態初始化塊。
也許更重要的區別是,你可以初始化多個最終變量,不要使用方法調用。 – jtahlborn
@jthalborn,謝謝。我沒有意識到你可以在'static {}'塊中操作'final'變量。結合以下有關初始化複雜對象類型的答案,可以回答這個問題。 – asteri