私はこの動作を理解していません。ラムダのクラスフィールドを使用
コードのこの作品は、準拠しています
public class A {
private String s;
private Function<String, String> f = e -> s;
public A(String s) {
this.s = s;
}
}
しかし、私はs
が最終作れば、私は、コンパイラのエラーを取得:
public class A {
private final String s;
private Function<String, String> f = e -> s; // Variable 's' might not have been initialized
public A(String s) {
this.s = s;
}
}
それはなぜですか?それ以外の場合、私は理解しますが、フィールドfinal
(コンストラクタでその値を初期化する必要があります)を宣言すると、コンパイラが不平を言って、それがどうでしょうだい、final
?
ラムダ式の基本的な性質は、周囲のコンテキストでの式のように機能するため、空白の最終変数へのアクセスに関する規則は同じです。これは内部クラスとは異なります。 'getA()'を呼び出すのではなく、 'Test.this.a 'を使って' a'にアクセスすることで回避できます。 – Holger
@Holgerありがとう、あなたがリンクした答えは非常に興味深く、はっきりしています。興味深いことに、 'a'と' this.a 'を介して 'a'にアクセスすることはエラーですが、' Test.this.a'はラムダの場合はエラーではなく、 'b'への割り当ての場合でもエラーです。 –
ほとんどすべてのJDK 8および9で 'b = Test.this.a; 'を試してみました。 [仕様](https://docs.oracle.com/javase/specs/jls/se8/html/jls-16.html)は、「*変数の単純な名前(またはフィールドの場合は、空白の最終変数へのアクセスを禁止する場合は '*'で修飾されたフィールドの単純名)。あなたはEclipseを使いましたか? – Holger