Какво означава, че една променлива е ефективно крайна?

В документацията за анонимните класове се посочва

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

Не разбирам какво означава променлива, която е "ефективен окончателен". Може ли някой да даде пример, който да ми помогне да разбера какво означава това?


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
когато декларираме окончателна ключова дума с променлива, компилаторът не ни позволява да променим стойността на променливата, но според ефективно окончателната, няма нужда да декларираме крайна ключова дума с променлива, така че възможно ли е да променим стойността на ефективната променлива? това означава, че когато променим стойността, променливата не е ефективно окончателна? - 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