Разница между final и effectively final в Java

java, javase, java8, effectively final, final java, final переменные
После выпуска новой редакции Java 8 вместе с lambda-выражениями в Java также было добавлено новое понятие effectively final. С технической стороны вопроса нет никакой разницы между final и effectively final.

Что такое модикатор final в Java?

Любая переменная с модификатором доступа final не подлежит какому-либо изменению.

Что такое effectively final в Java?

Любая переменная, находящаяся снаружи lambda-выражения и проинициализированная единожды в локальной области видимости(в методе), является effectively final переменной и может быть использована в lambda-выражениях. Effectively final переменная очень похожа на final переменную, с единственным отличием: нет необходимости использовать модификатор final при объявлении переменной.

Пример effectively final переменной в Java

Разъяснения по коду

Первая часть: Всем нам доводилось использовать интерфейс Runnable. И, как Вы знаете, для использования переменной вне области видимости анонимного класса, ей необходимо присвоить модификатор final. Если Вы попытаетесь использовать переменную объявленную, как non-final, вне области видимости интерфейса Runnable, то компилятор “выбросит” следующую ошибку:

Cannot refer to a non-final variable Firstname inside an inner class defined in a different method

Вторая часть:

Для использования lambda-выражения мы создаем список listStrings. У нас имеется переменная lastName, которая инициализируется только однажды в программе, поэтому она является effectively final переменной и может быть использована внутри lambda-выражения.

Если вы раскомментируете строку lastName += "";, то компилятор “бросит” следующую ошибку:

local variables referenced from a lambda expression must be final or effectively final

Результат выполнения программы:


Вы так же можете ознакомиться с другими материалами по теме:


Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *