2010-01-12 17 views
10

Betrachten Sie den folgenden Code ein:Wird Java anonyme Klassen "zwischengespeichert"?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • Wie wird Java behandeln die Klasse von currentList?
  • Wird es eine andere Klasse für jedes der 200 Objekte betrachten?
  • Wird es ein Leistungseinbruch sein, selbst nachdem das erste Objekt erstellt wurde?
  • Speichert es es irgendwie?

Ich bin nur neugierig :)

+3

umgewandelt werden Afaik eine anonyme Klasse ist eine einfache Klasse mit nur einem generierten Namen. nichts mehr. Caching wird wie bei jeder Klasse im Classloader durchgeführt. – ZeissS

+0

tatsächlich wird dies einen Compilerfehler erzeugen: 'i' ist nicht endgültig, was eine schlechte Idee für einen as-Schleifenzähler wäre. Aber eine gute Frage! –

Antwort

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

eine neue Instanz der anonymen Klasse jedes Mal durch Ihre Schleife zu schaffen, ist es nicht neu zu definieren oder die Klasse jedes Mal neu geladen wird. Die Klasse wird einmal (zur Kompilierzeit) definiert und einmal (zur Laufzeit) geladen.

Durch die Verwendung von anonymen Klassen wurde keine wesentliche Leistungseinbuße erzielt.

+2

... und die Referenz "currentList" ist nach der for-Schleife nicht erreichbar und neu angelegt. In diesem Sinne wird das Objekt, auf das verwiesen wird (die innere Klasseninstanz), sofort für die Garbage Collection markiert. – OscarRyz

15

Der Compiler wird jede anonyme Klasse in eine benannte innere Klasse umwandeln. So wird Ihr Code in etwas in der Form von:

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); 
} 
Verwandte Themen