最后或实际上最后的困惑

时间:2019-07-09 09:08:34

标签: java java-8 functional-programming

我确定variables accessed within inner class, should be declared final or effectively final。但是在以下情况下,我感到困惑。我不知道我是否误会了。

public class MyClass {
    private boolean aBoolean = false;
    private Consumer<Boolean> consumer;
    private Consumer<Validatable> vConsumer; // Validatable is an interface that I wrote

    public MyClass(Consumer<Boolean> c) {
        this.vConsumer = validatable -> aBoolean = validatable.hasErrors();
        this.consumer = c;
    }

    public void process() {
        consumer.accept(this.aBoolean);
    }
}

在上述情况下,我没有收到任何错误。怎么可能?请帮助

1 个答案:

答案 0 :(得分:4)

我们在规格中可以看到:

  

...从Java SE 8开始,本地类可以访问最终变量或有效最终变量的局部变量和封闭块的参数。 变量或参数的值在初始化后从未更改,实际上是最终的。

这意味着effectively final是仅与变量和参数有关的概念。在这里,我们可以看到您正在使用lambda中的MyClass字段而不是变量,它可能有多个分配。