Jak se mi "minulé novinky" zamlouvaly, tak tyhle zase tak moc ne. Toto se dá uspokojivě řešit něčím jako IOUtils.closeQuietly() (z Commons IO) nebo si napíšu vlastní metodu (klidně i s vyhazováním vyjímek):
void close(Closeable... objs) throws Exception { Exception ex = null; for (Closeable o : objs) { try { o.close(); } catch (Exception e) { if (ex == null) ex = e; } } if (ex != null) throw e; }
Jenze kam se tato metoda ma napsat? Do tridy, ktera s closeable objekty pracuje nebo jako staticka metoda (=funkce) do vlastni tridy? V prvnim pripade to bude copy & paste na 100 mistech ve vetsim projektu ne?
A navic to reseni v Jave (7) neni nijak genialni, to je pravda, ale zase je citelne a nestane se, ze byste zapomel na to, pridat referenci na tento objekt do vasi metody close (a to jeste na spravne misto - i kdyz tady to mate flexibilnejsi nez Java).
Jo a tusim, ze vyjimky (kdyz treba close()s vyhodi 3) se ve vasem pripade ztrati ;-)
Kdyz se neco deje "samo" neni to zrovna 2x prehledne. Jeste pochopit se to da u ruznych frameworku ale jako zaklad jazyka... nevim nevim. Ne vzdy chci volat close na vsem. Tim padem budou existovat pripady kdy nejake inicializace napisu do try() a nektere az do try{} - bude v tom jeste vetsi bordel.
Kam to napsat: nejlepe jako util tridu do java api. nebo jinam, to uz bude asi jedno.
Zapomenout se da na ledasco a ta nova syntax me nenuti ji pouzivat, takze zapomenout zavrit stream stejne muzu.
S tema vyjimkama: vyjimky se strati vzdy... nelze vyhodit 3 vyjimky najednou a nemuze to udelat ani tato specialni konstrukce. Podle logiky veci sem pochopil ze se vyhodi ta prvni a proto jsem to tak do kodu napsal. Klidne muzu vyhodit nejakou MultipleException ktera bude obsahovat seznam vyjimek...
Tohle je typicka staticka metoda do nejakeho helpru. Takze import static ... A znamena to pak volani close(opjekt) nic vic. (Btw. asi by bylo lepsi mit tu metodu lepe pojmenovanou).
P.S.: Nicmene si nemyslim, ze by pridani tohohle do jazyka byl nejaky spatny krok. Aspon je hned na startu videt co se inicializuje jako nejaky omezeny zdroj. I kdyz zase na druhou inicializujete tak neco v dobe kdyz jeste ani nemusite vedet jestli to budete potrebovat (treba vam ten kod vylitne driv nez se k pouziti daneho zdroje dostanete) v opacnem pripade se stejne nevyhnete spouste zanorenych try finally bloku.
Take si myslim, ze pridani ARM neni spatny krok. Ta inicializace az v dobe pouziti by sla mozna "obejit" nasledovne:
try ( T t1 = new T("T1"); T t2 = null; ) { ... neco, neco, neco ... t2 = new T("T2"); }
Otazka zni, zda-li se s necim takovym pocita + programator musi davat bacha na NullPointerException.
S.