2013-12-19 32 views
0

我有一個變量聲明爲在Java中最後關於在Java中聲明爲final的變量的一些說明?

如果我在我的代碼聲明以下變量以下疑問:

private final String CURRENT_USER; 

的Eclipse告訴我下面的錯誤信息:的空白最終字段CURRENT_USER可能尚未初始化

爲什麼?從我目前瞭解,如果我一個變量聲明爲最終我可以初始化只有一次,但在我看來,我可以初始化它,只有當我在代碼中聲明它,而不是某個地方後...

爲什麼?

TNX

安德烈

+1

因爲你不應該能夠使用未初始化的變量。 –

+0

確實 - WHEN會被初始化嗎?這是不確定的。而不確定因素在爪哇地區是一個不容否認的問題。 – Gimby

回答

5

你必須在聲明或在構造函數中進行初始化。

要麼

private final String CURRENT_USER = "SomeUser"; 

或在構造

private final String CURRENT_USER; 

public YourClassName(){ 
    CURRENT_USER = "test"; 
} 

但是,你應該在駝峯命名實例變量方式

private final String currentUser; 

否則有人(包括我)認爲這是一見鍾情。

+1

@OliCharlesworth謝謝我對命名感到困惑。 –

0

JLS says

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

這是有道理的,類似的理由如下

public void someMethod() { 
    String s; 
    System.out.println(s); 
} 

你不應該能夠使用未初始化的變量。由於它是final,你只能初始化一次,你必須等到初始化發生。

你沒有那麼多的選擇。在使用它之前,在實例初始化塊或構造函數中初始化它。

1

Java正在警告您,因爲您創建了一個字段;但沒有初始化值 - 因此,它隱含地爲空。

private final String CURRENT_USER; // <-- CURRENT_USER = null; 

您可以設置此常數構造函數,或者你可以使用一個初始化塊;例如,

private final String CURRENT_USER; 
{ 
    CURRENT_USER = UserLoader.getCurrentUser(); // <--- load the user. 
} 

或使用的構造方法(再次,作爲一個例子),

public MyConstructor(String user) { 
    CURRENT_USER = user; 
} 
0

被聲明最終變量必須在聲明(即),靜態塊或構造進行初始化的對象。聲明最後事情的

private final String CURRENT_USER = "SOMETHING"; 

部分是保證該值將提供給該對象一旦完全初始化 - 否則,你就會有一個最終的,空的對象。