2013-12-19 31 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"; 

部分是保证该值将提供给该对象一旦完全初始化 - 否则,你就会有一个最终的,空的对象。