5. ledna 2008

Nová Java: Chceme ji? - potřetí

Původně jsem si myslel, že na tenký led typu closures se pouštět nebudu, protože to je hodně pálivé téma, ale když už se do toho pustil Dagi, chci přidat svůj pohled.

Předně co si pod pojmem closures představuji já: v podstatě zavolatelný kód, takový pointer na funkci. Nespojoval bych to se správou zdrojů (Automatic Resource Management).

Nejprve jsem si prošel všechny návrhy, které se okolo closures v Javě 7 přetřásají (JSR, BGGA, CICE, FCM, C3S). Musím se přiznat, že přestože jsem relativně dost nakloněn novinkám v Javě, tak BGGA návrh mi přijde hodně špatný. Kód je složitý, closures není možné použít všude, kde to dává smysl, a tzv. closures se nechovají jako kus Java kódu (nejde použít break, continue ani dokonce return). Takže pokud otázka stojí: Chceme BGGA návrh jako closures do Javy? říkám jasně a nahlas Ne.

Je jasné, že přidat do Javy closures tak jak je známe např. z Groovy se asi nepovede. Takže potřebujeme nějakou zjednodušenou variantu. A ty vidím dvě. První, která se mi líbí kvůli velmi jednoduché syntaxi a široké nabídce možností, je FCM (First Class Methods). Jsem přesvědčen, že mi pomůže skutečně zjednodušit všechny typy algoritmů, kde si na closures vzpomenu, když je píšu v Javě.

Kdyby existoval argument proč FCM nepoužít, pak se kloním k CICE, které není tak jednoduché jako FCM a není tak moc komplexní, ale přesto nabízí hodně. Bohužel neodstraňuje nutnost existence rozhraní, které bude "closure" implementovat...

Věřím, že se BGGA v Javě 7 nedočkáme ...

2 komentáře:

Ladislav Thon řekl(a)...

> Kód je složitý,

Jak pro koho :-) Ale pokud se do toho zamotají kontrolované výjimky, pak je to masochismus nejhrubšího zrna, o tom žádná :-)

> closures není možné použít všude, kde to dává smysl,

Např.? Mne žádné takové místo nenapadá, pokud se dobře pamatuju, měla by existovat automatická konverze na rozhraní.

> a tzv. closures se nechovají jako kus Java kódu (nejde použít break, continue ani dokonce return).

Samozřejmě že lze, i když se na první pohled může zdát, že nelogicky. Ovšem nelokální návrat je (AFAIK) jediná možnost, jak konzistentně definovat sémantiku těchto příkazů uvnitř lexikálního uzávěru, a krom toho je mnohem užitečnější než naivní způsob.

> Takže pokud otázka stojí: Chceme BGGA návrh jako closures do Javy? říkám jasně a nahlas Ne.

Mluvte za sebe :-), já říkám jasně a nahlas ANO :-)

jira řekl(a)...

to ladislav thon> Čerpám z následující prezentace Joshuy Blocha.

ad 1) Příklady, které jsou v této prezentaci uvedeny mi skutečně nahánějí husí kůži a to do toho ani nemusí motat Exceptions

ad 2) Closures není možné použít např. v definici pole

ad 3) Přiznám se, že mi není jasné, proč je nelokální návrat užitečný, mě přijde prostě matoucí a nežádoucí, ale možná si jenom představuju jenom něco jiného než se implementuje

ad 4) Rozhodně bych si netroufl mluvit za někoho jiného než za sebe :-)