在没有初始化程序的情况下将局部变量声明为final,并在if语句中指定

Axe*_*xel 14 java eclipse variables final declaration

我只是做了一个小代码更改来沉默FindBugs警告,该警告需要将一些代码移动到匿名内部类.为了访问一些变量,我不得不将它们声明为final.所以这是更改后的代码片段:

final File[] libPath; // libPath is final but assignment takes place later
if (libraryPath != null) {
    libPath = pathToFiles(libraryPath);
} else {
    libPath = new File[0];
}
Run Code Online (Sandbox Code Playgroud)

这在当前Eclipse(版本3.7.1)中使用设置为Java 6的语言编译得很好.但是我很确定这曾经在某些先前版本中出错.似乎编译器在确定存在时接受此构造.

我的问题是:这在Java 6中是否合法,或者由于Java 7支持的副作用被添加到eclipse 3.7.1中,它现在是否可行?我们已经看到了这些副作用,其中某些泛型的使用在3.7.1中有效但在3.7.0中没有编译.

Ken*_*ent 14

还行吧.它被称为空白决赛

维基引用:

最终变量只能通过初始化程序或赋值语句初始化一次.它不需要在声明点初始化:这称为"空白最终"变量.必须在声明它的类的每个构造函数的末尾明确赋值类的空白最终实例变量; 类似地,必须在声明它的类的静态初始值设定项中明确赋值空白的最终静态变量:否则,在两种情况下都会发生编译时错误.[4](注意:如果变量是引用,这意味着变量不能重新绑定到引用另一个对象.但它引用的对象仍然是可变的,如果它最初是可变的.)

空白决赛

在Java 1.1中引入的空白final是一个最终变量,其声明缺少初始化程序.[5] [6]空白决赛只能分配一次,并且在分配发生时必须取消分配.为了做到这一点,Java编译器运行流分析以确保对于空白最终变量的每个赋值,在赋值之前肯定未赋值变量; 否则会发生编译时错误.[7]

通常,Java编译器将确保在为其分配值之前不使用空白final,并且一旦赋值,则现在的final变量不能重新分配另一个值.[8]

链接:http://en.wikipedia.org/wiki/Final_%28Java%29


x4u*_*x4u 8

自Java 1.1以来,这被允许并且工作正常,并且不会让您遇到其他编译器或IDE的麻烦.

它是Java中的标准行为,并且首先在Java语言规范第2版中正式指定.