Project Technical Lead
Java news: Java JDK 21 – stručný prehľad chystaných noviniek
Blíži sa vydanie novej verzie Java JDK a my na našom blogu sme sa rozhodli bližšie pozrieť na novú funkcionalitu jazyka. Cieľový dátum vydania je naplánovaný na 19. septembra 2023. Je však možné si už túto verziu stiahnuť v predbežnom prístupe (Early Access) a začať prvé experimenty. (V staršom článku sme sa venovali charakteristike Java 20 JDK.)
Java 21 (po Jave 17) je opäť verzia s dlhodobou podporou (LTS), čo znamená, že Oracle poskytne bezplatné aktualizácie aspoň po dobu piatich rokov, až do septembra 2028, a rozšírenú platenú podporu až do septembra 2031.
Poďme si v stručnosti predstaviť obsah JDK 21 a načo sa môžeme tešiť. Prehľad začneme tými najzaujímavejšími novými funkciami a vylepšeniami.
Virtual threads (virtuálne vlákna)
Virtuálne vlákna (virtual threads) sú ľahké vlákna, ktoré značne zjednodušujú písanie, údržbu a sledovanie vysoko výkonných súbežných aplikácií. Zahŕňajú možnosť škálovania serverových aplikácií napísaných vo forme vlákno-na-požiadanie efektívnym využitím hardvéru, možnosť jednoduchej migrácie existujúceho kódu, ktorý používa API lang.Thread, na virtuálne vlákna s minimálnymi zmenami a možnosť jednoduchého ladenia a profilovania virtuálnych vlákien pomocou súčasných nástrojov JDK.
Virtuálne vlákna boli predstavené v JDK 20 a JDK 19 a budú dokončené v JDK 21. S JDK 21 virtuálne vlákna teraz podporujú lokálne premenné vlákna počas celej doby behu a nie je dovolené vytvárať virtuálne vlákna bez týchto premenných. Zaručená podpora lokálnych premenných vlákna tak zabezpečí, že veľa existujúcich knižníc bude môcť byť použitých s virtuálnymi vláknami bez zmeny.
Sequenced collections (sekvenčné kolekcie)
Sekvenčné kolekcie, resp. kolekcie s usporiadaním sú ďalšou zaujímavou novinkou a JDK 21 prináša návrh kolekcií s usporiadaním a zavádza rozhrania pre kolekcie s definovaným usporiadaním. Každá kolekcia má jasne definované prvý, druhý a tak ďalej, až po posledný prvok. Sú poskytnuté jednotné API pre prijímanie prvých a posledných prvkov a pre spracovanie prvkov v opačnom poradí. Motiváciou pre tento návrh je skutočnosť, že framework pre kolekcie v Jave nemá typ kolekcie, ktorý by reprezentoval postupnosť prvkov s definovaným usporiadaním. Tiež mu chýba jednotná množina operácií, ktoré sa uplatňujú na tieto kolekcie. Tieto medzery boli problémom a zdrojom sťažností. Návrh požaduje definovanie rozhraní pre sekvencie kolekcií, množín a máp a ich zahrnutie do existujúcej hierarchie typov kolekcií. Všetky tieto nové metódy majú preddefinované implementácie.
Record patterns (vzory záznamu)
Vzory záznamu umožňujú dekonštruovať hodnoty záznamov. Vzorové záznamy a vzorové typy možno vnárať, čo umožňuje silné, deklaratívne a kombinovateľné vyhľadávanie a spracovanie dát. Ciele návrhu zahŕňajú rozšírenie vzorového porovnávania na deštrukciu inštancií tried záznamov a pridanie vnorených vzorov, čím sa umožní kompozícia dátových dotazov. Táto funkcia sa vyvíjala súbežne s porovnávaním vzorov pre switch výrazy.
Pattern matching for switch (porovnávanie vzorov pre switch)
Táto funkcia umožňuje výrazu/príkazu switch testovať sa voči viacerým vzorom, každý s konkrétnou akciou, čo umožňuje bezpečné a stručné vyjadrenie zložitých dátových dotazov. Táto funkcia bola pôvodne navrhnutá v JDK 17, upravovaná v ďalších verziách a v JDK 21 by mala byť dokončená a upravená na základe spätnej väzby a skúseností Java vývojárov. Hlavné zmeny oproti predchádzajúcim verziám JEP zahŕňajú odstránenie zátvoriek vo vzoroch a umožnenie kvalifikovaných enumeračných konštánt, ďalej zvýšenie bezpečnosti výrazov a príkazov switch vyžadovaním toho, aby sa pokrývali všetky možné vstupné hodnoty. Ďalším cieľom je zabezpečiť, aby existujúce switch zápisy zostali funkčné bez zmien a vykonávali sa s rovnakou sémantikou.
String templates (šablóny reťazcov)
Toto je funkcia vo forme ukážky v JDK 21, ktorá dopĺňa existujúce reťazcové literály a textové bloky v Jave tým, že spája takýto text s vloženými výrazmi a procesormi na vytvorenie špecializovaných výsledkov. Tento jazykový prvok a API má za cieľ zjednodušiť písanie Java programov tým, že umožňuje jednoducho vyjadriť reťazce, ktoré obsahujú hodnoty vypočítané počas behu programu. Sľubuje zlepšenie čitateľnosti výrazov, zvýšenie bezpečnosti programu, zachovanie flexibility a zjednodušenie používania API, ktoré prijímajú reťazce napísané v iných jazykoch ako je Java. Funkcia tiež umožňuje vývoj nereťazcových výrazov vytvorených kombináciou textových literálov a vložených výrazov.
Unnamed patterns and variables (nepomenované vzory a premenné)
Táto funkcia zlepšuje čitateľnosť a údržbu kódu tým, že umožňuje vytvárať vzory bez uvádzania mena alebo typu komponentu. Nepomenované premenné môžu byť inicializované, ale nie sú použité. Cieľom je eliminovať zbytočné vnorené vzory a identifikovať nepoužívané premenné.
Unnamed classes and instance main methods (nepomenované triedy a hlavné metódy inštancií)
Táto funkcia je zameraná na zjednodušenie písania prvých Java programov, kde študenti nemusia hneď rozumieť funkciám jazyka určeným pre komplexnejšie projekty. Umožňuje vytvárať jednoduché programy a postupne ich rozširovať o pokročilejšie funkcie.
Structured concurrency (štruktúrovaná súbežnosť)
Štruktúrovaná súbežnosť zjednodušuje programovanie v súbežnom prostredí pomocou API, ktoré spravuje skupiny súvisiacich úloh ako jednotky práce. Týmto sa zlepšuje správa chýb, čo zvyšuje spoľahlivosť a pozorovateľnosť. Táto funkcia, ktorá bola predtým testovaná v JDK 20 a JDK 19, teraz dostáva podporu ako ukážkové API v balíku util.concurrent.
Scoped values
Preview verzia tejto funkcie, umožňuje zdieľanie nemenných dát medzi vláknami a komponentami. Scoped hodnoty sú preferované pred vláknovými lokálnymi premennými, najmä pri použití veľkého počtu virtuálnych vlákien. Táto funkcia zlepšuje čitateľnosť a robustnosť kódu.
Prepare to disallow the dynamic loading of agents
Zákaz dynamického načítavania agentov – táto zmena je zameraná na vylepšenie integrity JVM tým, že upozorní na načítanie agentov dynamicky počas behu aplikácie. Cieľom je zlepšiť rovnováhu medzi servisnými zmenami a integritou kódu a zabezpečiť, aby väčšina nástrojov nebola ovplyvnená touto zmenou.
Key encapsulation mechanism API (API pre zabezpečenie kľúčov)
Táto funkcia umožňuje používanie algoritmov pre zabezpečenie symetrických kľúčov pomocou verejnej kryptografie. Cieľom je umožniť aplikáciám používať algoritmy ako RSA Key Encapsulation Mechanism (RSA-KEM) a Elliptic Curve Integrated Encryption Scheme (ECIES) v rôznych protokoloch a kryptografických schémach.
Generational ZGC
Táto funkcia je zameraná na zlepšenie výkonu aplikácií pomocou oddelených generácií pre mladé a staré objekty. Generational ZGC umožňuje efektívnejšie zhromažďovanie mladých objektov a prináša nižšiu spotrebu pamäte a nižšiu záťaž na garbage collection (zber nepotrebnej alokovanej pamäte).
Foreign function & memory API
Umožňuje interoperabilitu Java programov s kódom a dátami mimo Java-runtime. Umožňuje volanie externých knižníc a bezpečný prístup k pamäti, čím nahradzuje JNI (Java Native Interface).
Vector API (vektorové API)
Toto API umožňuje vykonávať výpočty vektorovo, čo vedie k lepšiemu výkonu oproti skalárnym výpočtom. Cieľom je poskytnúť jednoduché a spoľahlivé riešenie pre vektorové výpočty na podporovaných architektúrach.
Deprecate the Windows 32-bit x86 Port for Removal
Táto zmena sa zameriava na odstránenie 32-bitového portu pre Windows x86 v budúcom vydaní. Windows 10, posledný operačný systém od Microsoftu s podporou 32-bitového režimu, končí svoj životný cyklus v októbri 2025.
Okrem týchto funkcií sa v JDK 21 pripravuje aj zmena v priradzovaní názvov sieťovým rozhraniam v systéme Windows. Taktiež je plánovaná experimentálna funkcia „compact object headers“, ktorá má znížiť veľkosť hlavičiek objektov v JVM a tak zmenšiť veľkosť pamäte.
Ak ťa nové vlastnosti Java JDK 21 zaujali a chcel by si sa dozvedieť o nich viac, odporúčame navštíviť oficiálnu webovú stránku OpenJDK.