[英]Java 8 supplier behaviour: final variable might not be initialized
Java不允许在供应商内部使用最终变量,因为最终变量可能尚未初始化,但以“(this)”开头。 变量使其可以编译并运行良好。
此外,在分配变量之前调用此类供应商会导致NullPointerException而不是编译器错误,并且在调用之后将按预期运行。
是否在某处描述了此行为?
我正在使用OpenJDK 1.8.0_151。
例:
import java.util.function.Supplier;
class Example {
final String str;
Supplier<Integer> test1 = () -> str.length(); // DOES NOT COMPILE
Supplier<Integer> test2 = () -> this.str.length(); // DOES NOT COMPILE
Supplier<Integer> test3 = () -> (this.str).length(); // DOES NOT COMPILE
Supplier<Integer> test4 = () -> (this).str.length(); // OK
Example(String str) {
System.out.println(test4.get()); // NullPointerException
this.str = str;
System.out.println(test4.get()); // OK
}
}
---
javac Example.java
Example.java:7: error: variable str might not have been initialized
Supplier<Integer> test1 = () -> str.length(); // DOES NOT COMPILE
^
Example.java:8: error: variable str might not have been initialized
Supplier<Integer> test2 = () -> this.str.length(); // DOES NOT COMPILE
^
Example.java:9: error: variable str might not have been initialized
Supplier<Integer> test3 = () -> (this.str).length(); // DOES NOT COMPILE
^
3 errors
在访问任何值时,每个局部变量(第14.4节)和最后一个空白字段(第4.12.4节,第8.3.1.2节)都必须具有一个明确分配的值。
对它的值的访问包括变量的简单名称(或者,对于字段而言,由其限定的字段的简单名称)出现在表达式中的任何位置,但作为简单赋值运算符=(§ 15.26.1)。
str
是最终字段的简单名称,而this.str
是使用this
限定的字段的简单名称。 (this).str
不会属于这两种情况( (this)
不算作“由this
限定”),因此也不算作访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.