Publikované pred 7 mesiacmi: 13.10.2011 / Andrej Chu, čítaní: 1751
Platforma Java sa na
konci júla (presne dvadsiateho ôsmeho) dočkala po takmer piatich rokoch svojej
novej major verzie. Verzie Javy od 5.0 (vrátane) sa vždy vyvíjali pod kódovým
označením podľa nejakého zvieraťa a ani táto nová, vydávaná pod (pre niektorých
šťastným) číslom 7, nie je výnimkou – po Tigrovi a Mustangovi prichádza
Dolphine (delfín).
Nová major verzia je výnimočná nielen pomerne dlhým odstupom od svojej predchodkyne, ale i tým, že ide o prvú, ktorá bola vydaná už pod krídlami Oraclu. V tomto článku sa oboznámime len s tým, aké zmeny jazyka Java prináša (tzv. podprojekt Coin, vyvíjaný pod JSR-334). Nezaoberáme sa ostatnými zmenami, ktoré nová platforma prináša (a ktorých je takisto dosť).
Operátor diamant
Prvé zlepšenie jazyka
Java, ktorého sa vo verzii 7 dočkáme, je tzv. operátor diamant (diamond), ktorý
pozostáva zo špicatých zátvoriek - <>. Za jeho zavedením je snaha o
odstránenie nutnosti otrockého opakovaného uvádzania typov pri deklarácii a
inštanciácii najmä zložitejších kolekcií. Keby sme dnes napríklad chceli
zadeklarovať zoznam hash tabuliek a zároveň ho inštanciovať, museli by sme
použiť nasledujúci zápis (ak ako implementujúci typ pre List použijeme
ArrayList):
List<Map<Integer, Object>> result = new ArrayList<Map<Integer, Object>>();
Z praxe iste viete, že typy na ľavej i pravej strane sa prakticky vždy budú zhodovať, a preto sa to vždy končí triviálnym Ctrl + C a Ctrl + V. Spomínaný nový operátor nám umožňuje kód zjednodušiť takto:
List<Map<Integer, Object>> result = new ArrayList<>();
Pri takomto zápise operátor diamant znamená jednoduché zdedenie deklarácie typu z ľavej strany výrazu, čo zvýši prehľadnosť kódu a uberie trošku otravnej práce programátorovi.
Reťazce v blokoch switch
Ďalšie zaujímavé rozšírenie
je možnosť použitia reťazcov ako rozhodovacích hodnôt v blokoch switch:
String s = pickTheBeatle();
switch (s) {
case "Paul":
playBass();
case "John":
case "George":
playGuitar();
break;
case "Ringo":
playDrums();
break;
default:
playKeyboard();
break;
}
Ako vidíme, reťazce možno v blokoch switch používať rovnakým spôsobom ako primitívne dátové typy.
Prehľadnejšie číselné literály
Medzi zmeny, ktorých
príchod zrejme nebude patriť medzi najočakávanejšie, by som zaradil možnosť
používať znak podčiarkovník _ ( angl. underscore) v číselných literáloch. To by
malo umožniť prehľadnejší (pre človeka) zápis čísel v kóde:
int number = 1_234_567;
Nechám na čitateľovi, aby sám posúdil, ako často túto novú vlastnosť využije. Na doplnenie dodám, že tento znak sa dá použiť v literáloch reprezentujúcich celé čísla int a long, a to tak v desiatkovom zápise, ako i v ostatných číselných sústavách (vrátane dvojkovej, ktorá je zavedená ako ďalšia z noviniek v Jave 7, pozri ďalej).
Číselné literály v dvojkovej sústave
Ďalšia zmena, ktorá sa
zrejme takisto zaradí do kategórie menej významných. Pokiaľ však niekto často
pracuje s číslami, ktoré potrebuje zapisovať v dvojkovej sústave a
reprezentovať ich v programe ako celé čísla, môže mu táto nová vlastnosť prísť
vhod.
Keby sme v staršej verzii Javy chceli zapísať číslo v programe v binárnej forme a pritom ho reprezentovať celočíselnou premennou, museli by sme to urobiť nasledujúcim spôsobom:
int binary = Integer.parseInt("10110111", 2);
Samozrejme, tento spôsob je nevýhodný nielen pre prehľadnosť a dĺžku zápisu, ale i pre výkon – metóda parseInt() je v tomto prípade pomalá a takisto je tu možnosť vyhodenia výnimky NumberFormatException (i keď nekontrolovanej).
Java 7 preto zavádza možnosť jednoduchšieho a výkonnejšieho zápisu pomocou prefixu 0b:
int binary = 0b10110111;
int binary = 0b1011_0111; // možnosť použitia podčiarkovníka
Automatická správa zdrojov
Pod týmto názvom sa
skrýva nová vlastnosť zlepšujúca klauzulu try. Ide o pomerne užitočnú novinku
najmä pri práci s I/O API, teda so vstupnými a výstupnými prúdmi. Pri klasickom
prístupe by sme napríklad pri čítaní údajov zo súboru museli postupovať asi
takto:
FileInputStream fis = null;
try {
fis = new FileInputStream("vstup.txt");
// ... načítavame údaje fis.read()
} finally {
if (fis != null) {
fis.close();
}
}
Java 7 zjednodušuje tento postup takto:
try (FileInputStream fis = new FileInputStream("vstup.txt")) {
// ... načítavame údaje fis.read()
}
Takto vytvorený zdroj bude automaticky uzatvorený (bude volaná jeho metóda close()) po skončení bloku try. Aby bolo možné daný zdroj takýmto spôsobom v bloku try používať, musí daná trieda implementovať rozhranie AutoCloseable, ktoré je takisto novinkou v Jave 7 a je v nej implementované všetkými triedami reprezentujúcimi prúdy v javovej knižnici I/O. Rovnako možno použiť tento zápis na obsluhu viacerých zdrojov naraz:
try (
FileInputStream fis = new FileInputStream("vstup.txt");
FileOutputStream fos = new FileOutputStream("vystup.txt")
) {
// ... načítavame údaje fis.read()
// ... zapisujeme údaje fos.write()
}
Je už na posúdení programátora, či bude túto zmenu považovať za zlepšenie prehľadnosti kódu a využije ju alebo zostane pri starom zápise, aby mohol mať lepšiu kontrolu nad tým, čo sa v programe deje.
Viacnásobný blok catch
Ďalšia novinka týkajúca
sa bloku try-catch-finally je tzv. multi-catch. Jej úlohou je zbaviť sa
zbytočne duplikovaného kódu v tých klauzulách catch, ktorých obsluha výnimiek
je totožná:
try {
// kód potenciálne vyhadzujúci výnimky
} catch (IOException e) {
// obsluha chyby, zalogovanie atď.
} catch (NullPointerException e) {
// obsluha chyby, zalogovanie atď.
} catch (NumberFormatException e) {
// obsluha chyby, zalogovanie atď.
}
S podobným kódom sa už každý vývojár iste stretol – opakovaná obsluha výnimiek niekedy zabrala i väčšinu tela metódy. Sčasti bolo možné tento problém občas vyriešiť spoločnou nadtriedou výnimiek, ale toto riešenie bolo málokedy použiteľné. Java 7 nám ponúka jednoduchý spôsob, ako sa opakovaniu kódu vyhnúť:
try {
// kód
potenciálne vyhadzujúci výnimky
} catch
(IOException | NullPointerException | NumberFormatException e) {
// obsluha
chyby, zalogovanie atď.
}
Oddeľovač | (pipe) nám umožňuje deklarovanie ľubovoľného počtu typov výnimiek. Prekladač nám však nedovolí uviesť dve výnimky, kde jedna je predkom tej druhej – vtedy treba uviesť len nadtyp alebo výnimky odchytiť viacerými blokmi catch.
Podľa môjho názoru ide o pomerne užitočnú pomôcku.
Čo viac?
Zmien, ktoré Java 7
prináša, je, samozrejme, oveľa viac. Za zmienku stojí napríklad trieda Objects
s užitočnými statickými metódami, nový Fork/Join framework na podporu viacvláknového
prístupu alebo použitie kľúčového slova final v klauzule catch (tzv. typovo
bezpečné opätovné vyvolanie výnimky). Zlepšený bol i balíček I/O, ktorému
pribudla možnosť sledovať zmeny v súborovom systéme (WatchService API) a
reagovať na ne, alebo grafická knižnica, ktorá bola obohatená o nové efekty.
Pre malú časť vývojárov môže byť zaujímavá zlepšená podpora typovo dynamických
jazykov.
Ďalej je obsiahnutých mnoho ďalších drobných zlepšení výkonu alebo aktualizácií (JDBC, XML API implementácií, sieťových protokolov, internacionalizácie atď.), ktoré však vývojár bez konkrétnej úzkej špecializácie asi väčšinou ani nezaznamená.
Java 8
Ďalšia verzia Javy by
mala byť vydaná koncom budúceho roka a okrem iného by sa v nej mali objaviť i
novinky, ktoré do nej boli presunuté z Javy 7, ako sú napríklad projekt Jigsaw na
modularizáciu JDK alebo aktualizácia Swing frameworku (napríklad s novým
grafickým prvkom na výber dátumu). Veľmi zaujímavé sú zmeny v jazyku, pretože
by sa mali zaviesť tzv. lambda výrazy (projekt Lambda). A pre mňa
najzaujímavejší je projekt na zavedenie podpory jednoduchšej práce s
kolekciami, najmä podpora indexovaného prístupu k nim. Táto vlastnosť napríklad
umožní následne pracovať s tabuľkami ako s asociatívnymi poľami. Na toto všetko
si však budeme musieť ešte chvíľku počkať.
Zdroj: Infoware 8-9/2011
Dĺžka:00:17:22
Dĺžka:00:25:58
Dĺžka:00:07:11
Dĺžka:00:55:21