Java - mírný pokrok v mezích zákona po třinácté

Java, jako jazyk i jako platforma, stále patří mezi nejrozšířenější a prý i nejoblíbenější na světě. Jestli to tak má zůstat, musí se rozvíjet. Bude třináctka v tomto případě šťastným číslem?

Adam Lindenthal

Photo by Ohmky on Unsplash

V úterý 17. září (škoda, pátek třináctého by byl stylovější) byla na konferenci Code One oficiálně představena nová verze platformy Java, tentokrát s číslem 13. To to letí, co? Od doby, kdy Oracle přešel na půlroční cyklus si nemohu zvyknout, jak to číslo verze leze rychle nahoru. Zatímco mezi verzemi 7 a 8 došlo k poměrně zásadním změnám v jazyce samotném, v dalších verzích se většinou jednalo o sice příjemná, leč marginální vylepšení. 

Pojďme se podívat, jestli je to tak i tentokrát a čím se nás tvůrci tentokrát rozhodli překvapit (ono to zas tak veliké překvapení nebude, protože - jak již bývá zvykem - preview je již pár měsíců k dispozici).

Novinky

Abychom na nic nezapomněli, začneme rovnou seznamem JEPů :-) 

  • JEP 350 Dynamic CDS Archives
  • JEP 351 ZGC: Uncommit Unused Memory
  • JEP 353 Reimplement the Legacy Socket API
  • JEP 354 Switch Expressions (preview)
  • JEP 355 Text Blocks (preview)

Člověk by novinky spočítal na prstech jedné ruky, praktické :-) Co jednotlivé řádky znamenají? První dva řeší efektivitu platformy a ruku na srdce, většinu z nás budou zajímat až v okamžiku, kdy nás trápí nějaký problém (nebo nějaký alespoň očekáváme). Zbylé tři už programátor může v praxi potkat a využít. I když, počkat… 

Co znamená “preview”?

Podle oficiální definice jsou to novinky, které jsou “plně specifikovány, plně implementovány, ale přesto ne nutně trvalé”. Mají vyprovokovat diskusi a jejich zveřejnění má vývojářům platformy zajistit zpětnou vazbu. V dalších verzích Javy tak mohou být zapracovány jako běžné, trvalé, vlastnosti, ale taky mohou zmizet úplně.

Aby omylem nedošlo k jejich použití v produkčním kódu, standardně nejsou ani zapnuté. K tomu, aby kód využívající preview fíčury šel vůbec přeložit, je potřeba volat kompilátor s přepínačem --enable-preview. V mavenu toho docílíme prostřednictvím compilerArgs elementu v konfiguraci compiler pluginu (popř. failsafe a surefire pluginů), v gradlu potom pomocí options.compilerArgs, resp. jvmArgs v sekcích compileJava a test.

Pod dekou

Ve zratce se podívejmě na první dvě novinky. Dynamic CDS Archives je vylepšení mechanismu zavedeného s Javou 5, CDS. Znamená to class data sharing a mělo by to pomáhat k rychlejšímu startu aplikací tím, že ukládá data o třídách do tzv. Class Data Sharing archivů, ke kterým může přistupovat více JVM. K průběžným vylepšením CDS došlo ve verzích 10 a 12, teď přichází další. Upřímně, víc jsem to zatím nezkoumal, ale koho to zajímá detailněji, zdrojů je dost, google je váš kamarád…

Další novinkou je vylepšení Z Garbage Collectoru (zavedeného ve verzi 11). Ten by měl nově umět na základě provozního stavu navrátit nevyužitou paměť rezervovanou pro aplikaci operačnímu systému, což může být užitečné zejména na hardwaru (ať už reálném či virtuálním), kde není prostor pro plýtvání.

Rekonstrukce veterána

Dostáváme se k další novince, a tou je nová implementace vysloužilého Socket API, které je již skutečným pamětníkem z JDK 1.0, tedy z doby, kdy se starší z vás učili v QBasicu na 386ce.

Původní PlainSocketImpl nahrazuje NioSocketImpl a jak již název napovídá, využívá “nové” New I/O.

Co nového přímo v syntaxi

Konečně to nejzajímavější, jak se změní syntaxe, jaké nové psí kusy nám Java 13 umožní? Jak už je patrné z předchozího textu, bez přepínače --enable-preview nic. Niente. Nada. S přepínačem si tak můžeme sice novinky vyzkoušet, ale použit to na reálné aplikaci není dobrý nápad. Na co se tedy můžeme (možná) v příštích verzích reálně těšit?

Vylepšený switch jako výraz

V předchozí verzi jazyka byla jako preview zavedena možnost použít switch nejen jako příkaz, ale i jako výraz. 

Navíc bylo zjednodušeno řízení “propadání” (falltrough) mezi jednotlivými větvemi, kdy se šipka místo dvojtečky chová jako příkaz break:

`<p>CODE: https://gist.github.com/Duck28/d90a3fbbd56cb7d10e17af9601a87b0d.js</p>`

Kromě toho se switch stal validním výrazem:

`<p>CODE: https://gist.github.com/Duck28/8c1ee29dee7addd97c6863319f9dbde7.js</p>`

Ve verzi 13 máme navíc místo šipky (při použití switche jako výrazu) jako alternativu výraz yield, který vrátí hodnotu a ukončí vyhodnocování:

`<p>CODE: https://gist.github.com/Duck28/2b28bb09ae5b782f301bdcac972d947b.js</p>`

Textové bloky

Text blocks je jednou z částí mnohem většího enhancementu (Raw String Literals, JEP 326) původně plánovaného již do Javy 12.

Novinka se podobá tomu, co umí např. Python a mnohé další jazyky. Netřeba dlouhých řečí, krátký příklad mluví za vše:

`<p>CODE: https://gist.github.com/Duck28/1c3065ae56ff388a7ce082d8f778a1be.js</p>`

Blok musí být uveden trojitými uvozovkami, za nimiž na stejném řádku nesmí následovat žádný jiný znak. Compiler řetězce zpracuje tak, jako by to byl jeden řetězec se znaky nového řádku, v bytekódu se nic nezmění. 

Subjektivně celkem pěkná záležitost, bude se to rozhodně hodit na SQL queries, JSONy v testech, nebo (nedejbože) nějaký HTML markup (pokud máte rádi špagety nejen na talíři). Funguje to i v anotacích a není tak problém využít přehlednější zápis query ve spring data JPA repositories. Tedy, až to nebude jen preview…

Závěrem

Co k tomu dodat? Je fajn, že se něco děje, ale mohlo by se dít víc. Jazyk jako takový se reálně nikam neposunul, pokud nepoužíváte preview režim. Těšme se tedy zase někdy v březnu, třeba tou budou větší žně.

Java
Java 13
novinky
Zpět →