2011-05-10 25 views
7

tengo el siguiente código:última variable local en Java

public class BookLib { 
    void f() { 
     final int x = 5; // Line 1 
     class MyCLass { 
      void print() { 
       System.out.println(x); 
      } 
     } 
    } 
} 

No entiendo por qué debería utilizar última variable en este caso (línea 1)?

+0

[Acerca de varibles finales locales en Java] (http://stackoverflow.com/questions/3013547/about-local-final-varibles-in-java) –

+0

relacionado http://stackoverflow.com/questions/154314/ when-one-use-final –

Respuesta

19

Has creado una clase interna aquí. Como el tiempo de vida de los objetos de esta clase puede ser potencialmente mucho mayor que el tiempo de ejecución de la invocación del método (es decir, el objeto puede existir mucho después de que el método haya retornado), necesita "preservar" el estado de las variables locales que puede acceder.

Esta preservación se realiza creando una copia (invisible, sintética) dentro de la clase interna y reemplazando automáticamente todas las referencias a la variable local con referencias a esa copia. Este podría provocar efectos extraños cuando la variable local se modifica después de que se creó el objeto de la clase interna.

Para evitar esto, existe el requisito de que todas las variables locales a las que acceda de esta manera son final: esto garantiza que solo exista un valor posible para la variable local y no se observan incoherencias.

Esta regla específica se pueden encontrar en §8.1.3 Inner Classes and Enclosing Instances de the JLS:

Cualquier variable local, parámetro del método formal o parámetro de gestión de excepciones utilizado pero no declarados en una clase interna debe declararse final. Cualquier variable local, utilizada pero no declarada en una clase interna debe estar definitivamente asignada (§16) antes del cuerpo de la clase interna.

+2

¿De qué efectos extraños estamos hablando aquí? ¿Las variables finales no están almacenadas en el marco de la pila o algo así? – rogerdpack

3

Aquí puede crear una clase interna. Para acceder al contexto de ejecución, las referencias a las variables deben permanecer intactas, de lo contrario se observa un comportamiento de error. Para garantizar esto, debes declarar tu variable final: así no se puede cambiar.

Véase la explicación detallada here.

0

Tiene una variable final local y una clase interna de método local. Una clase interna local de método no puede usar variables no finales declaradas dentro del método (incluidos los parámetros).

Para profundizar en esto: La clase interna local del método se puede instanciar solo dentro del método donde se define la clase. Las variables locales viven en la pila durante el tiempo de vida del método. A medida que el método finaliza, las variables locales desaparecen, sin embargo, el objeto de clase interno creado aún vive.

Es una cuestión de vida útil/alcance.

+0

Puede usar campos (no definitivos) ... – krookedking

+0

@krookedking No puede usar la variable no final declarada dentro del método (incluidos los parámetros). – Jurri

+0

lo siento, interpreté "no puedo usar otra cosa que variables locales finales" ya que "no puedo usar otra cosa que variables locales finales" – krookedking

1

De Kathy Sierra scjp libro

Las variables locales del método viven en la pila, y sólo existen durante la vida útil del método. Ya sabemos que el alcance de una variable local se limita al método en el que se declara la variable. Cuando el método finaliza, el marco de la pila se destruye y la variable es historia. Pero incluso después de que el método se complete, el objeto de clase interna creado dentro de él podría estar todavía vivo en el montón si, por ejemplo, una referencia a él se pasa a otro código y luego se almacena en una variable de instancia. Debido a que no se garantiza que las variables locales estén activas, siempre y cuando el objeto de la clase interna local del método, el objeto de la clase interna no pueda usarlas. ¡A menos que las variables locales estén marcadas como finales!