Что означает "эффективная окончательная" переменная?

документация в состояниях анонимных классов

Анонимный класс не может получить доступ к локальным переменным в своей охватывающей области которые не объявляются окончательными или фактически окончательными.

Я не понимаю, что означает переменная, являющаяся "эффективной окончательной". Может ли кто-нибудь привести пример, чтобы помочь мне понять, что это значит?

Ответы

Ответ 1

Эффективно конечный означает, что он не изменяется после получения начального значения.

Простой пример:

public void myMethod() {
    int a = 1;
    System.out.println("My effectively final variable has value: " + a);
}

Здесь a не объявляется окончательным, но считается эффективным окончательным, поскольку он никогда не изменяется.

Начиная с Java 8, это можно использовать следующим образом:

public void myMethod() {
    int a = 1;
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("My effectively final variable has value: " + a);
        }
    };
}

В Java 7 и более ранних версиях a должен был быть объявлен final для использования в локальном классе, подобном этому, но из Java 8 достаточно, чтобы он был окончательным.

Ответ 2

В соответствии с docs:

Переменная или параметр, значение которого никогда не изменяется после инициализации, равно effectively final.