2013-06-19 109 views
1

程序代碼:我想最終的變量初始化成一個功能

public class A{ 
    public static final String l; 

    public void method(String strTestData){ 
    l = strTestData; 
    } 
} 

strTestData將包含類似「公共靜態最終java.lang.String中刪除」的數據。 有可能嗎?

+1

是否有具體原因的情況下方法正在影響一個類變量(它不允許這樣做,但它是不尋常的) –

+0

如果你想讓一個類在使用前經歷一個初始構建狀態,可以考慮使用* builder模式*來代替 - 分離日e生成器部分分成一個獨立的類。這可以讓您將最終字段保留在構建的類中。 –

回答

8

這是不可能的。

如果聲明一個static final字段,它必須在靜態初始化程序中或在聲明點進行初始化。您以後不能修改該值。例如:

public static final String l = "Foo"; 

public static final String l; 

static { 
    l = "Bar"; 
} 

也許你應該只是刪除final修改?

1

如果一個變量被聲明爲final,那麼只能初始化它一次。事實上,你需要初始化一次。當你聲明成員變量或者構造函數時,這必須發生。

試圖改變它也是不可能的。

+0

OP的變量是'static',所以它不能在構造函數中初始化。 – GriffeyDog

1

您無法初始化方法中的final變量。這是需要的,因爲編譯器需要確保該變量僅初始化一次。

可以隨時調用一個方法,因此編譯器無法確保該變量只被初始化一次。

2

我想最終的變量初始化成一個功能

NO,你不能做到這一點。這是根據JLS8.3.12

它是一個編譯時間錯誤,如果空白的最終(§4.12.4)類變量 未明確賦值(§16.8)通過靜態初始化(§8.7) 它聲明的類。

空白最終實例變量必須在 被明確賦值(§16.9)每一個構造的端部(§8.8),其中它是 聲明的類的;否則會發生編譯時錯誤。

因此你的代碼應該是這樣的:

public class A{ 
    public static final String l; 
    static 
    { 
     l = "Static String initialized.."; 
    } 
} 

或者,你可以在聲明時初始化最後的變量,如下所示:

public static final String l = "Static String initialized..";