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ářů:
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 ...
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.
To bychom mohli definovat zkratkovou syntaxi pro vetsinu knihovnich trid - napr. pro swingove komponenty.
Tak pouzivej Jython.
a co treba Arrays.asList(T... a) , vam muze dobre poslouzit
to kubino> To jiste muze, a taky slouzi. Ale jak na mapy?
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.
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");}};
Okomentovat