2010-01-12 31 views
10

Considere el siguiente código:¿Las clases anónimas en "caché" de Java son?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • ¿Cómo tratar la clase de Java de currentList?
  • ¿Considerará que es una clase diferente para cada uno de los 200 objetos?
  • ¿Será un golpe de rendimiento incluso después de que se crea el primer objeto?
  • ¿Lo está almacenando en caché de alguna manera?

Tengo curiosidad :)

+3

Afaik an anonymous class es una clase simple con solo un nombre generado. nada mas. El almacenamiento en caché se realiza como con cada clase en el cargador de clases. – ZeissS

+0

en realidad esto generará un error de compilación: 'i' no es final, lo que sería una mala idea para el contador de ciclos. ¡Pero una buena pregunta! –

Respuesta

15
ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 

es la creación de una nueva instancia de la clase anónima cada momento a través de su bucle, no es la redefinición o volver a cargar la clase cada vez. La clase se define una vez (en tiempo de compilación) y se carga una vez (en tiempo de ejecución).

No hay un rendimiento significativo al usar clases anónimas.

+2

... y la referencia "currentList" no será accesible después del bucle for y se creará de nuevo. En ese sentido, el objeto al que hace referencia (la instancia de clase interna) se marcará para la recolección de basura inmediatamente. – OscarRyz

15

El compilador va a transformar cualquier clase anónima en una clase interna con nombre. Entonces su código se transformará en algo similar a:

class OuterClass$1 extends ArrayList<Integer> { 
    OuterClass$1(int i) { 
     super(); 
     add(i); 
    } 
} 

for (int i = 0; i < 200; i++) { 
    ArrayList<Integer> currentList = new OuterClass$1(i); 
} 
Cuestiones relacionadas