6. ledna 2008

Nová Java: Chceme ji? - počtvrté

Myslím, že jsem se dostal do finále, alepoň pro tento okamžik, protože poslední věc, která by jistě zasloužila vylepšení je vytváření naplněných collections. Dneska je nutné vytvořit instanci (Collection nebo Map) a postupně do ní přidávat prvky.

Jistě existují různé "zkratky" přes pole, která můžeme vytvářet pomocí inicialiazátoru. Další pokrok přináší Google Collections Library, ale stále to není ono. A přitom jednoduchou syntaxi již máme vymyšlenou, např. pro Groovy.

Takže proč collection nevytvořit:

Collection<Object> col = [ 1, 2, "33", new Long(10) ];
Je to jistě jednodušší než:
Collection<Object> col = new ArrayList<Object>();
col.add(1);
col.add(2);
col.add("33");
col.add(new Long(10));
Jen pro dolnění, prázdná mapa je: [].
Pokud přejdeme na na mapy, je věc identická. Nejprve klasicky v Javě:
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "1");
map.put(2, "dva");
map.put(3, "3");
A jak by tyto 4 řádky vypadaly, kdyby se vylepšila syntaxe vytváření map:
Map<Integer, String> map = [ 1:"1", 2:"dva", 3:"3" ];
Jenom pro doplnění prázdná mapa se vytvoří [:].

Závěr

Nedokážu odpovědět na otázku, zda takovou Javu chceme? Za sebe mohu říci, že změny, které jsem navrhoval podporuju. Ale nesmí dojít k nejasnostem jako v případě implementace generik. Vše musí zapadnout do již existujícího jazyka a fungovat. Pokud se ukáže nějaký problém, jsem pro, aby se z implementace vycouvalo.
Otázkou samozřejmě je, zda je nutné zachovat zpětnou kompatibilitu. Myslím si, že není problém udělat nekompatibilní JavuX a vní implementovat vše co potřebujeme, ale je to co chceme? Ja myslím, že ne, protože to už by nebyla Java ...

7 komentářů:

Jerry! řekl(a)...

Ne, nic takového nechci. Kolekce pro mě představuje určitou abstrakci množiny a seznamu. To co zde prezentujete, je vytvoření instance implementující dané rozhraní a zároveň její naplnění - tedy dva kroky najednou.
Co by tam asi kompiler/jvm dalo za implementaci? ArrayList? DelayQueue? Co když očekávám větší množství prvků a hodila by se HashSet? Rozezná, co je množina a co seznam? Ne, tudy cesta skutečně nevede ...

jira řekl(a)...

to jerry> Jakou by tam dal překladač implementaci? No přeci tu nejpoužívanější, tj. ArrayList a HashMap. Zbytek si dokážete udělat sám, např. new TreeMap( [ 1:"1", 2:"2" ] );

Seznam od množiny nerozezná, ale vytvoří kolekci, která se dá dál předat do konstruktoru toho správného typu. Navíc neočekávám, že někdo tímto způsobem inicializoval kolekci o 1000 prvcích.

Uf řekl(a)...

To bychom mohli definovat zkratkovou syntaxi pro vetsinu knihovnich trid - napr. pro swingove komponenty.

Tak pouzivej Jython.

Kubino řekl(a)...

a co treba Arrays.asList(T... a) , vam muze dobre poslouzit

jira řekl(a)...

to kubino> To jiste muze, a taky slouzi. Ale jak na mapy?

NkD řekl(a)...

Take nic takoveho nechci. Proc si vy priznivci tohoto "obohacovani" Javy nevytvorite jednoduche Utility tridy, ktere budou delat presne to co chtete ? Konkretne pro tebou uvedeny zkraceny zapis je to otazku nekolika malo minut. Java se "neuspini" a vy budete mit svoje syntakticke cukratko i kdyz ne na urovni syntaxe jazyka.

Anonymní řekl(a)...

Uvedene inicializace jde napsat v jave na 1 radek uz dnes, ale je to trochu delsi nez navrhovana syntaxe:

Collection<Object> col = new ArrayList<Object>(){{add(1);add(2);add("33");add(new Long(10));}};

Map<Integer, String> map = new HashMap<Integer, String>(){{put(1, "1");put(2, "dva");put(3, "3");}};