Обычно возникает путаница при работе с лямбда-выражениями в Java, когда встречается предупреждение: «локальные переменные, на которые ссылается лямбда-выражение, должны быть final или effectively final». Чтобы разобраться в этом, давайте разберемся, что означают эти два термина.
Final
Ключевое слово final
в Java используется для обозначения того, что значение переменной не может быть изменено после того, как оно было инициализировано. Если переменная объявлена как final
, любые попытки изменить ее значение приведут к ошибке компиляции.
Вот пример:
final int x = 10; x = 20; // Ошибка компиляции: "нельзя присвоить значение final переменной x"
Effectively final
С появлением Java 8 вводится понятие «effectively final». Переменная считается «effectively final», если ее значение не изменяется после инициализации, даже если она не объявлена как final
. Это означает, что переменная не обязательно должна быть явно объявлена как final
, если ее значение не изменяется после инициализации.
Вот пример:
int x = 10; x = 20; // Переменная x больше не является "effectively final", // так как ее значение было изменено после инициализации
Важно: «Effectively final» переменная может быть использована в лямбда-выражениях и анонимных классах, так как Java гарантирует, что ее значение не будет изменено.
Важно отметить, что ключевое слово final
и понятие «effectively final» связаны с тем, как переменная используется, а не с тем, как она объявлена.
Итог
Итак, разница между final
и «effectively final» заключается в том, что final
является ключевым словом, которое применяется при объявлении переменной и означает, что ее значение не может быть изменено после инициализации, тогда как «effectively final» — это понятие, которое означает, что значение переменной не изменяется после инициализации, даже если она не объявлена как final
.
Добавить комментарий