2012-01-31 52 views
10

什麼時候應該使用未初始化的靜態最終變量?我知道一個未初始化的靜態最終變量只能在靜態初始化塊中賦值,但我想不出有什麼實際用途。什麼時候應該使用未初始化的靜態最終變量?

+0

也許_never_? – 2012-01-31 17:43:48

+0

「空白」是什麼意思?你的意思是一個'static final'變量被初始化爲'null'嗎?或者你只是指任何一種'static final'變量('private static final','public static final'等)? – 2012-01-31 17:44:03

+0

他意味着空白,因爲在未初始化。 – fivedigit 2012-01-31 17:45:44

回答

8

我假設你的意思是:

public static final Object obj; 

與沒有明確分配初始值?

您可以根據只能在運行時發生的某些計算將它分配到static塊中,如讀取某些屬性文件以創建在編譯時未知的應用程序範圍內的常量。

+0

非常感謝! – 2012-02-02 18:32:04

+0

@Tudor,爲什麼它默認爲'null'?這種行爲在規格中保證了嗎?在我看來,默認值是未定義的,因爲我們無法在分配之前先讀取它(編譯器錯誤)。 – Pacerier 2014-06-17 16:34:29

+0

@Prier:看上去很好。如果不給「final」字段賦值,確實會產生編譯時錯誤,規範說這些字段永遠不會被默認。我糾正了我的答案。 – Tudor 2014-06-17 16:43:33

17

當初始化變量不能在一行中完成時使用它。例如:

private static final Map<String, String> CACHE; 

static { 
    Map<String, String> cache = new HashMap<String, String>(); 
    cache.put("foo", "bar"); 
    cache.put("zim", "bam"); 
    // lots of other entries 
    CACHE = Collections.unmodifiableMap(cache); 
} 
5

基本上,如果您需要指定一個不能在單個表達式中輕鬆表示的值。例如,您可能想要執行一些邏輯來構建不可變映射,然後分配它。

一般來說,更具可讀性把「建設」邏輯到一個單獨的靜態方法和使用,在正常作業,但:

private static final Map<String, String> FOO_MAP = buildFooMap(); 
+0

謝謝!它給了我更好的解釋。 – 2012-12-31 10:40:05

0

靜態+最終

總之,

靜態 - 以使其爲類變量 - 獨立對象的(可通往每個對象總是相同的位置)

Final - 使它成爲一個常數(如果final是在變量ofcourse!之前!)

我們在哪裏只需要靜態?

=>可以計算一個對象的實例數量。

我們在哪裏只需要最終?

=>好,讓事情不變!

我們在哪裏需要static + final?

=>使變量可以訪問每個對象,並使一個常量。爲COLOR創建類可能是。

對於空白靜態變量,初始化由靜態塊完成。

public class StaticDemo 
{ 
    private static final String name; 

    static 
    { 
     name = "yash"; 
    } 
} 

爲什麼使用空白的?因爲可能是你一開始就無法初始化。我接受前一個的。

0

如果靜態字段的初始化程序可能會引發異常,則無法將其初始化爲一行,但必須具有靜態塊或靜態方法。

+0

謝謝!它可以是未初始化的靜態最終變量的一種用法。 – 2012-12-31 10:38:29

0

靜態final變量必須在創建時初始化,與空白最終變量不同,不能將初始化推遲到構造函數,因爲它們是靜態的。

相關問題