Что означает, что переменная является эффективной final?

В документации по анонимным классам говорится

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

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


person Aniket Thakur    schedule 31.01.2014    source источник
comment
stackoverflow.com/questions/20938095/ - хотя я думал, что быть final было требованием для доступа к локальной переменной из псевдо-замыканий Java (но я довольно часто ошибаюсь/устарел): -/   -  person user2864740    schedule 31.01.2014


Ответы (2)


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

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

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 этого достаточно, чтобы он был фактически окончательным.

person Keppil    schedule 31.01.2014
comment
когда мы объявляем ключевое слово final с переменной, компилятор не позволяет нам изменить значение переменной, но, согласно эффективному финалу, нет необходимости объявлять ключевое слово final с переменной, поэтому можно ли изменить значение эффективной переменной? это означает, что когда мы меняем значение, переменная не является окончательной? - person Harmeet Singh Taara; 22.04.2014
comment
@Harmeet: Действительно, если бы вы изменили значение, оно больше не было бы фактически окончательным, поэтому вы не можете изменить значение действительно окончательной переменной. - person Keppil; 23.04.2014

Согласно документам:

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

person Kick    schedule 31.01.2014
comment
Можете ли вы добавить ссылку на соответствующий документ? - person Behe; 31.01.2014
comment
@Behe извините, что пропустил путь к документу. Пожалуйста, найдите в docs.oracle. com/javase/tutorial/java/javaOO/localclasses.html - person Kick; 31.01.2014