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