繁体   English   中英

Java 8供应商行为:最终变量可能未初始化

[英]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

JLS版本9,第16章开始

在访问任何值时,每个局部变量(第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM