2010-01-12 8 views
10

Rozważmy następujący kod:Czy Java "buforuje" anonimowe klasy?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • Jak Java traktować klasę currentList?
  • Czy uzna to za inną klasę dla każdego z 200 obiektów?
  • Czy będzie to hit, nawet po utworzeniu pierwszego obiektu?
  • Czy to jakoś buforuje?

Jestem tylko ciekaw :)

+3

Afaik anonimowa klasa to prosta klasa z tylko wygenerowaną nazwą. nic więcej. Buforowanie jest wykonywane tak, jak w przypadku każdej klasy w programie ładującym klasy. – ZeissS

+0

faktycznie to wygeneruje błąd kompilatora: 'i' nie jest ostateczny, co byłoby złym pomysłem na licznik pętli. Ale dobre pytanie! –

Odpowiedz

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

tworzy nową instancjęz anonimowej klasy każdym razem za pośrednictwem pętli, to nie jest przedefiniowanie lub przeładowywania klasa każdym razem. Klasa jest zdefiniowana raz (podczas kompilacji) i ładowana raz (w czasie wykonywania).

Nie ma znaczącego wyniku skuteczności z korzystania z anonimowych klas.

+2

... a referecja "currentList" nie będzie dostępna po pętli for i ponownie utworzona. W tym sensie obiekt, do którego się odwołuje (wewnętrzna instancja klasy), zostanie natychmiast oznaczony do zbierania śmieci. – OscarRyz

15

Kompilator przekształci każdą anonimową klasę w nazwaną wewnętrzną klasę. Twój kod zostanie przekształcony w coś podobnego do:

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