2009-12-22 20 views
18

Tome el ejemplo siguiente:¿Dónde se almacenan las variables locales finales de Java?

public void init() { 
    final Environment env = new Environment(); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

En primer lugar, en donde se almacenan env? Es:

  • copiado por el compilador en una variable miembro oculto de la clase interna que hace referencia a que
  • copia en, y se hace referencia en adelante, el montón
  • izquierda en la pila y de alguna manera hace referencia no
  • algo más

Mi suposición es la primera opción.

En segundo lugar, haga cualquier problema de rendimiento que surja al hacer esto (en lugar de simplemente crear env como una variable miembro de la clase y hacer referencia a ella como tal) particularmente si está creando un gran número de construcciones de clase interna que hacen referencia variables.

Respuesta

18

Sí, se copian, por lo que debe declarar la variable como definitiva. De esta forma, se garantiza que no cambiarán después de que se haya realizado la copia.

Esto es diferente para los campos de instancia, que son accesibles aunque no sean finales. En este caso, la clase interna obtiene una referencia a la instancia externa que utiliza para este propósito.

private Environment env; // a field does not have to be final 

public void init() { 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

En segundo lugar, hacer cualquier problema de rendimiento que surgen de hacer esto?

Comparado con qué? Necesita tener el campo o la variable alrededor para que funcione su clase interna, y una copia es una forma muy eficiente. De todos modos, es solo una copia "superficial": solo se copia la referencia al Entorno (en su ejemplo), no el Entorno mismo.

+0

Entonces, ¿puedo suponer que no surgen problemas de rendimiento al hacer esto? – Joel

+0

Mi preocupación personal en esta área es que las referencias a la instancia externa (utilizada para acceder a los campos, no a las variables, que se copian) pueden ser un problema, si no son necesarias: http://stackoverflow.com/questions/ 758570/is-it-possible-to-make-anonymous-inner-classes-in-java-static – Thilo

+0

en comparación con la referencia como una variable miembro. Si se copia, entonces, mi suposición es que no hay implicaciones de rendimiento. – Joel

Cuestiones relacionadas