Почему мы используем ключевое слово final с анонимными внутренними классами?

В настоящее время я готовлю S (O) CJP с книгой Sierra & Bates.

Что касается внутренних классов (локальный или анонимный метод), они говорят, что мы не можем получить доступ к локальным переменным, потому что они живут в стеке, в то время как класс живет в куче и может быть возвращен методом, а затем попытаться получить доступ к этим переменным. которые находятся в стеке, но больше не существуют, так как метод завершился ...

Как мы все знаем, мы можем обойти это, используя ключевое слово final. Это то, что они говорят в книге, но на самом деле они не объясняют, каков эффект этого ключевого слова final ... Насколько я знаю, использование ключевого слова final в локальной переменной метода не делает его живым в куче. .. Итак, как класс сможет получить доступ к конечной переменной, которая все еще находится в стеке, когда стека больше не может быть ???

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


person Sebastien Lorber    schedule 16.08.2011    source источник


Ответы (2)


Ваша интуиция верна, поскольку переменная окончательная, и ее можно безопасно скопировать. Конечно, для ссылочных типов это означает копирование ссылки на объект, а не на объект, на который она ссылается.

person brain    schedule 16.08.2011

Компилятор использует хитрые уловки, копируя последнюю ссылку под крышками, чтобы позволить внутреннему классу добраться до последнего поля во внешнем классе. Копирование - вот почему поле должно быть окончательным, чтобы значение не изменилось.

См., Например, http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/

person Thorbjørn Ravn Andersen    schedule 16.08.2011
comment
Да, но компилятор мог скопировать переменную, даже если она не была окончательной. Я предполагаю, что требование, чтобы он был окончательным, делает код более явным, и он не изменится. - person Steve Kuo; 16.08.2011
comment
Проблема, насколько я понимаю, в том, что если вам не требуется, чтобы она была окончательной, вам нужно гораздо более тщательно отслеживать ее обработку и обновление всякий раз, когда изменяется внешняя переменная. Что делать, если у вас много экземпляров внутреннего класса, и все они нуждаются в обновлении? - person Thorbjørn Ravn Andersen; 16.08.2011