Odpovídáte na názor ke článku Lambda výrazy v Javě.
Lambdy nejsou jen syntaktický cukr nad anonymními třídami, kompilují se jinak. Zatímco anonymní třída vždycky vede na standardní class soubor (ala Foo$1.class), tak lambda vede na invokedynamic instrukci, kterou může JVM realizovat v podstatě jak se jí chce.
To má za následek několik věcí: zaprvé méně bytekódu a menší využití permgenu (resp. meta spacu nebo jak se ta jeho náhrada teď jmenuje). A za druhé, pokud je daná lambda stateless a nezachytává žádné lokální proměnné z vnějšího scopu, může pro ni JVM vygenerovat obyčejnou statickou metodu, což je nejen opět rychlejší a úspornější z hlediska paměti, ale i zabraňuje ne moc očividným, ale o to nepříjemnějším problémům, které lze anonymními třídami způsobit.
Definujeme-li anonymní (či lokální třídu) v instanční metodě, bude mít její instance implicitní referenci na objekt obalující třídy. Představte si, že v nějakém GUI dialogu si vytvoříte anonymní Runnable, ten někam pošlete do fronty, a okno dialogu zavřete. Nu, dokud se daný Runnable neprovede a nezahodí, tak bude držet referenci na tento dialog, který tím pádem nebude moc být uklizen pomocí GC. Memory leak jak vyšitý. O obdobné situaci, kdy vytvoříme anonymní subclassu nějaké serializovatelné třídy, radši ani nemluvě.
Ad [4]:
Nedokážu si představit, jak by takový Runnable "adaptér" měl vypadat. Můžete to rozvést?
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 207×
Přečteno 25 364×
Přečteno 23 797×
Přečteno 20 180×
Přečteno 17 876×