Odpověď na názor

Odpovídáte na názor ke článku Lambda výrazy v Javě.

  • 10. 3. 2014 22:36

    Natix (neregistrovaný)

    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?