Окончательная или фактически окончательная путаница - PullRequest
1 голос
/ 09 июля 2019

Я уверен, что 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 Ответ

4 голосов
/ 09 июля 2019

Как мы видим в спецификации:

... начиная с Java SE 8, локальный класс может обращаться к локальным переменным и параметрам заключающего блока, которые являются окончательными или фактически конечными. Переменная или параметр, значение которых никогда не изменяется после его инициализации, фактически является окончательным.

Это означает, что effectively final - это понятие, которое относится только к переменным и параметрам. Здесь мы видим, что вы работаете с полем MyClass внутри лямбды, а не с переменной, она может иметь более одного присваивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...