Замыкания позволяют моделировать поведение путем инкапсуляции кода и контекста в одну конструкцию.
Ключевая концепция заключается в том, что ваш код функции (лямбда) можетссылаются не только на свои собственные переменные, но также и на все внешнее, видимое для кода, переменные a
и b
в вашем случае.
В Java замыкания могут ссылаться только на конечные или эффективные конечные переменные.Это означает, что ссылка на переменную не может быть изменена, и замыкание видит только фактическое неизменяемое состояние (значение на самом деле не является неизменным, окончательное означает, что переменная не может быть переназначена).В теории это не обязательно.Например, в JavaScript вы можете написать такой код:
function newCounter() {
let count = 0;
return function() { return ++count; };
}
const nc = newCounter();
console.log(nc()); // 1
console.log(nc()); // 2
console.log(nc()); // 3
Здесь внутренняя функция newCounter
по-прежнему имеет доступ к count
(ее контекст) и может изменять его (переменная является изменяемой).
Обратите внимание, что переменная counter
недоступна для любых других частей вашего кода за пределами замыкания.