J2SE 7

28.6.2011, po piatich rokoch vývoja bola zverejnená nová verzia Java Standarnd Edition, verzia 7. V krákom článku sa teraz spolu pozrieme na to, aké najzaujímavejšie novinky priniesla.

Kompletný zoznam zmien možete nájsť na oficiálnej stránke Oraclu tu. Z toho, čo tam nájdete, som sa ja rozhodol vybrať tieto témy: projekt Coin, nové java.nio API a Fork/Join framework.

Projekt Coin

Cieľom tohto projektu bolo umožniť ľuďom navrhnúť rôzne drobné (názov bol vybraný práve kvôli zdôrazneniu tej drobnosti) vylepšenia jazyka, ktoré by im umožnili jednoduchšie každodenné používanie. Nakoniec sa ich vyzbieralo približne 70 a z nich boli realizované tieto:

  1. String ako parameter switch – po novom je možné používať v konštrukcii Switch aj typ String a na základe neho nájsť správnu vetvu. Nezabudnite samostatne otestovať, či reťazec nie je null, inak to spôsobí výnimku.

  2. Vylepšená syntax čísel – do číselných konštánt je po novom možné zapisovať znak podtržníka „_“. Takže číslo 1000 môžete zapísať ako 1_000. Je to čiste záležitosť syntaxe a na samotnú hodnotu nemá žiaden vplyv.

  3. Binárne hodnoty – do primitívnych číselných typov je možné po novom ukladať čísla v binárnom formáte. Teda, napr.: int x = 0x1010101

  4. Multicatch – jeden catch blok je možné použiť na odchytávanie rôznych výnimiek.

  5. Try-with-resources – ak máte objekt, ktorý implementuje rozhranie AutoClosable (po novom je od neho odvodené Closable), tak viete použiť nový try konštrukt, ktorý za vás automaticky objekt zatvorí v prípade normálneho ukončenia, ale aj v prípade výnimky.

  6. Diamantový operátor (škaredším názvom Improved Type Inference for Generic Instance Creation) – parameter generického typu pri definovaní premennej je možné po novom odvodiť z ľavej strany priradenia. Inak povedané, je možné zapísať toto:

    Map<Integer, Map<String, String>> map = new HashMap<>();

  7. Nové varovanie o vararg generickom parametry– Java nemá rada polia generických typov. Ak použijete vararg parameter s generickým typom, tak vo vnútri sa vytvorí práve také pole. V predchádzajúcej verzii dostal varovanie len ten, kto takú metódu volal. Po novom aj ten, kto ju vytvoril.

Nové java.nio API (NIO 2)

Java SE 7 prináša už tretiu generáciu API pre prácu so súborovými systémami, ktoré by malo zjednodušiť používanie a vyriešiť niektoré problémy. So „súborovými systémami“ som napísal naschvál, pretože jednou z nových vlastností je to, že je možné vytvoriť Provider triedu pre ľubovoľný hierarchický systém, a takto s ním pracovať ako so štandardným súborovým. Distribúcia Javy v sebe obsahuje takýto provider pre klasický súborový systém, a tiež pre ZIP súbory (teda pracujem s obsahom ZIP súboru ako s normálnym súborovým systémom).

Základom celého API je trieda Path. Tá reprezentuje cestu k objektu, pričom cesta v tomto momente ešte nemusí existovať. Na manipuláciu sa používajú statické metódy triedy Files. Pribudli metódy, ktoré umožňuju rýchly zápis a čítanie zo súboru v rámci niekoľkých riadkov bez nutnosti pracovať so streamami a pod.

Ďalšie vylepšenia predstavuje jednoduché vyhľadávanie v rámci adresára alebo celej adresárovej štruktúry, podpora liniek alebo atribútov súborov pre konkrétny typ operačného systému (napr. POSIX operačný systém).

N v názve znamená nonblocking, a to znamená asynchrónne programovanie. Cieľom bolo umožniť programu pokračovať vo vykonávaní aj v čase, kedy ešte prebieha operácia so súborovým systémom. Nové API podporuje dva takéto asynchrónne modely: future a callback. Ten prvý by ste mali použiť vtedy, ak nepotrebujete zareagovať okamžite na skončenie IO operácie, ale v pravidlených intervaloch budete prerušovať inú činnosť a kontrolovať jej výsledok. Ten druhý by ste mali použíť práve v tých prípadoch, kedy potrebujete zareagovať okamžite na ukončenie IO operácie.

Fork/Join Framework

Ide o novú implementáciu rozhrania Executor, ktorá vo vnútri používa steal work algoritmus. Základný princíp tohto algoritmu je, že prácu rozdelí medzi niekoľko vlákien, ktoré pracujú paralelne. Každé vlákno má svoj vlastný zásobník, z ktorého si prácu berie, ale pred jej vykonaním sa ešte rozhoduje, či už má dostatočne malý kúsok na to, aby sa pustil do spracovaniaalebo nie. Ak nie, tak si prácu rozdelí na dve časti, uloží ich na vrch zásobníka, opäť vyberie najvyššiu časť a znova vykoná rozhodnutie. Takto sa pre každé vlákno vytvára zásobník, kde v dolnej časti sú najväčšie kusy a v hornej najmenšie. Kradnutie práce má tento algorimus v názve preto, lebo ak sa niektorému vláknu minie všetka práca, tak sa môže pozrieť do zásobníka iného vlákna a z jeho dolnej časti jeden diel ukradnúť. Keďže paralelnéalgoritmy sú len tak dobré, koľko je v nich synchronizácie, je snaha, aby jej bolo najmenej. Práve pri tomto kradnutí prebieha nejaká synchronizácia medzi prvým a druhým vláknom, a aby jej bolo najmenej, je algoritmus navrhnutý tak, aby druhé vlákno ukradlo zo zásobníka čo najväčší kus práce. A ten je … práve v dolnej časti zásobníka.

Je samozrejme, že podobne ako pri map-reduce, aj v tomto prípade sa potom výsledky jednotlivých algoritmov zbierajú a nakoniec spájajú do jedného vysledku (reduce).

Okrem týchto spomenutých vecí, Java 7 priniesla aj mnoho drobných vylepšení v rôznych oblastiach. Za zmienku stojí zajímavý fakt, a to že došlo k oddeleniu špecifikácie jazyka javy (JLS) a špecifikávie virtuálneho stroja (VMspec). Hlavne v tom smere, že VMspec sa už nijako neodkazuje na Javu ako jazyk. Je to nepochybne len ďalší krok v iniciatíve, ktorá je jasná už niekoľko rokov a to, že z Java Runtime sa stáva multiplatforma, ktorá dokáže vstrebať rôzne jazyky s rôznymi vlastnosťami.