2011-08-16 7 views
23

Actualmente estoy preparando el S (O) CJP, con el libro de Sierra & Bates.¿Por qué usamos la palabra clave final con clases internas anónimas?

Acerca de las clases internas (método local o anónimo), dicen que no podemos acceder a las variables locales porque viven en la pila mientras la clase vive en el montón y pueden ser devueltas por el método y luego intentar tener acceso a estas variables que están en la pila pero que ya no existen desde que el método ha terminado ...

Como todos sabemos, podemos evitar esto usando la palabra clave final. Esto es lo que dicen en el libro, pero en realidad no explican cuál es el efecto de esa palabra clave final ... Por lo que sé, el uso de la palabra clave final en un método de variable local no lo hace vivir en el montón ... Entonces, ¿cómo podría la clase acceder a una variable final que todavía vive en la pila mientras no podría haber más pila?

Supongo que debe haber algún tipo de "copia" de esta variable local final dentro de la clase interna. Como el valor no puede cambiar, ¿por qué no duplicar esta información? ¿Alguien puede confirmar esto o decirme si me falta algo?

Respuesta

18

Su intuición es correcta, porque la variable es definitiva, es seguro hacer una copia de la misma. Por supuesto, para los tipos de referencia, esto significa copiar la referencia al objeto y no al objeto al que se refiere.

11

El compilador usa un truco sutil copiando la referencia final bajo las cubiertas para permitir que la clase interna llegue al campo final en la clase externa. La copia es por qué el campo debe ser final, por lo que el valor no cambia.

Véase p. http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/

+0

Sí, pero el compilador aún podría copiar la variable aunque no fuera definitiva. Supongo que si se requiere que sea final, el código es más explícito y no cambiará. –

+2

El problema, a mi entender, es que si no necesita que sea definitivo, necesita mantener un seguimiento mucho más cuidadoso para manejar esto y actualizar cada vez que cambie la variable externa. ¿Qué sucede si tiene numerosas instancias de la clase interna y todas necesitan ser actualizadas? –

Cuestiones relacionadas