2010-01-12 14 views
10

Si consideri il seguente codice:Java sta "memorizzando nella cache" classi anonime?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • che modo Java trattare la classe di currentList?
  • Lo considererà una classe diversa per ciascuno dei 200 oggetti?
  • Sarà un successo in termini di prestazioni anche dopo la creazione del primo oggetto?
  • E 'il caching in qualche modo?

Sono solo curioso :)

+3

Afaik una classe anonima è una classe semplice con solo un nome generato. niente di più. Il caching viene eseguito come con ogni classe nel classloader. – ZeissS

+0

in realtà questo genererà un errore del compilatore: 'i' non è definitivo, che sarebbe una cattiva idea per come contatore di loop. Ma una bella domanda! –

risposta

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

sta creando una nuova istanza della classe anonima ogni volta attraverso il vostro ciclo, non è ridefinire o ricaricare la classe ogni volta. La classe viene definita una volta (in fase di compilazione) e caricata una sola volta (in fase di esecuzione).

Nessun impatto significativo sulle prestazioni derivante dall'uso di classi anonime.

+2

... e il riferimento "lista corrente" non sarà raggiungibile dopo il ciclo for e verrà creato nuovamente. In questo senso l'oggetto a cui fa riferimento (l'istanza della classe interna) verrà immediatamente contrassegnato per la garbage collection. – OscarRyz

15

Il compilatore trasformerà qualsiasi classe anonima in una classe interna denominata. Quindi il tuo codice verrà trasformato in qualcosa del tipo:

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); 
} 
Problemi correlati