DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

12章4

このコードスニペットでは、変数 i は実質的に final とは言えません。なぜなら、変数 i はラムダ式内で参照される前に再代入されているためです。具体的には、i がラムダ式内で使用される前に i++ によってその値が変更されています。このため、コンパイル時にエラーが発生します。

以下は該当する部分を示します:

void sample() {
    int i = 0;
    Supplier<Integer> foo = () -> i;
    i++; // ここで i の値が変更されるため、実質的に final ではなくなる
    System.out.println(foo.get());
}
Enter fullscreen mode Exit fullscreen mode

このコードは、コンパイル時に以下のエラーが発生します:

local variables referenced from a lambda expression must be final or effectively final
Enter fullscreen mode Exit fullscreen mode

ラムダ式で参照される変数 i が実質的に final と見なされるためには、その値が再代入されないことが必要です。したがって、再代入されるコードを削除または変更する必要があります。

修正例:

void sample() {
    final int i = 0;
    Supplier<Integer> foo = () -> i;
    // i++; // この行を削除
    System.out.println(foo.get());
}
Enter fullscreen mode Exit fullscreen mode

もしくは、

void sample() {
    int i = 0;
    Supplier<Integer> foo = () -> i;
    System.out.println(foo.get());
    i++; // ラムダ式の後に i を変更
}
Enter fullscreen mode Exit fullscreen mode

このように、ラムダ式内で使用する変数が変更されないようにすることで、実質的に final として扱われ、コンパイルエラーを回避できます。

Top comments (0)