Po šesti měsících vývoje společnost Oracle vydala platformu Java SE 17 (Java Platform, Standard Edition 17), jejíž referenční implementací je otevřený projekt OpenJDK. S výjimkou odstranění některých zastaralých funkcí v Java SE 17 byla zachována zpětná kompatibilita s předchozími verzemi platformy Java — většina starších Java projektů bude fungovat bez změn na nové verzi. Sestavení Java SE 17 připravená k instalaci (JDK, JRE a Server JRE) jsou k dispozici pro Linux (x86_64, AArch64), Windows (x86_64) a macOS (x86_64, AArch64). Referenční implementace Java 17 vyvinutá v rámci projektu OpenJDK je zcela otevřená pod licencí GPLv2 s výjimkami GNU ClassPath, které umožňují dynamické spojení s komerčními produkty.
Java SE 17 je zařazena mezi vydání s dlouhou podporou (LTS), aktualizace pro kterou budou vydávány do roku 2029. Vydávání aktualizací pro předchozí mezivydání Java 16 bylo ukončeno. Předchozí LTS větev Java 11 bude podporována do roku 2026. Další LTS verze je plánována na září 2024. Připomínáme, že od vydání Java 10 projekt přešel na nový rozvojový proces, který zahrnuje kratší cykly vytváření nových verzí. Nové funkce se nyní vyvíjejí v jedné neustále aktualizované master větvi, do které se zahrnují již hotové změny, a od které se každých šest měsíců oddělují větve pro stabilizaci nových vydání.
Mezi novinkami Java 17 lze zmínit:
- Byla navržena experimentální implementace vzorového matchingu v ‚switch‘ výrazech, která umožňuje používat flexibilní šablony v ‚case‘ značkách pokrývající celou řadu hodnot, pro které bylo dříve nutné používat objemné řetězce ‚if…else‘. Dále je uvnitř ‚switch‘ zajištěna možnost zpracování hodnot NULL. Object o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
- Je stabilizována podpora uzavřených („sealed“) tříd a rozhraní, která nemohou být použita jinými třídami a rozhraními pro dědění, rozšiřování nebo přepisování implementace. Uzavřené třídy také poskytují deklarativnější způsob omezení používání supertřídy, než jaký nabízejí modifikátory přístupu, založený na explicitním výčtu podtříd oprávněných k rozšiřování. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {...}
- Byla navržena druhá předběžná implementace API Vector, která poskytuje funkce pro vektorové výpočty prováděné pomocí vektorových instrukcí procesorů x86_64 a AArch64, které umožňují současně aplikovat operace na více hodnotách (SIMD). Na rozdíl od funkcí automatického vektorizace skalárních operací dostupných v JIT kompilátoru HotSpot nový API umožňuje explicitní řízení vektorizace pro paralelní zpracování dat.
- Byla přidána předběžná implementace API Foreign Function & Memory, pomocí kterého mohou aplikace interagovat s kódem a daty mimo Java runtime. Nové API umožňuje efektivně vyvolávat funkce, které neprobíhají v JVM, a přistupovat k paměti, která není spravována JVM. Například je možné vyvolávat funkce z externích sdílených knihoven a přistupovat k datům procesu bez použití JNI.
- Rendering engine pro macOS, který zajišťuje práci s API Java 2D, které je zase integrováno do API Swing, byl přizpůsoben pro použití grafického API Metal. Na platformě macOS se stále používá OpenGL jako výchozí, a pro aktivaci podpory Metal je třeba nastavit parametr „-Dsun.java2d.metal=true“ a mít alespoň vydání macOS 10.14.x.
- Byl přidán port pro platformu macOS/AArch64 (počítače Apple založené na nových čipech Apple M1). Charakteristikou portu je podpora mechanismu ochrany paměti W^X (Write XOR Execute), při kterém nemohou být stránky paměti zároveň přístupné pro zápis i provádění. (kód může být proveden pouze po zákazu zápisu, a zápis do stránky paměti je možný pouze po zákazu provádění).
- Bylo vráceno používání pouze přísné (strictfp) sémantiky pro výrazy s plovoucí desetinnou čárkou. Byla ukončena podpora sémantiky „default“, která byla k dispozici od verze Java 1.2 a zahrnovala zjednodušení pro práci na systémech se starými matematickými koprocesory x87 (po zavedení instrukcí SSE2 potřeba další sémantiky vymizela).
- Byly implementovány nové typy rozhraní pro generátory pseudonáhodných čísel, stejně jako byly zavedeny další algoritmy pro kvalitnější generaci náhodných čísel. Aplikacím byla poskytnuta možnost vybrat si algoritmus generace pseudonáhodných čísel. Byla vylepšena podpora generace proudů náhodných objektů.
- Byla zavedena povinná přísná enkapsulace všech interních prvků JDK, s výjimkou kritických API, jako je sun.misc.Unsafe. Přísná enkapsulace blokuje pokusy o přístup z kódu k interním třídám, metodám a polím. Dříve bylo možné režim přísné enkapsulace deaktivovat pomocí volby „—illegal-access=permit“, nyní je však označena jako zastaralá. Pro aplikace, které potřebují přístup k interním třídám, metodám a polím, by mělo být výslovně určeno pomocí volby „—add-opens“ nebo atributu Add-Opens v manifestovém souboru.
- Aplikacím byla poskytnuta možnost definovat filtry pro deserializaci dat, které mohou záviset na kontextu a vybírat se dynamicky vázané na určité operace deserializace. Stanovené filtry jsou aplikovatelné na celé virtuálním stroji (JVM-wide), tj. pokrývají nejen samotnou aplikaci, ale i použité externí knihovny.
- V Swing byla přidána metoda javax.swing.filechooser.FileSystemView.getSystemIcon pro načítání ikon ve velkém formátu, což umožňuje vylepšit tvorbu rozhraní na obrazovkách s vysokou hustotou pixelů (HighDPI).
- V API java.net.DatagramSocket byla implementována podpora pro připojení k skupinám Multicast bez nutnosti používat zvláštní API java.net.MulticastSocket.
- Byla vylepšena utilita IGV (Ideal Graph Visualizer), která poskytuje interaktivní vizualizaci mezivrstvy kódu v JIT kompilátoru HotSpot VM C2.
- V JavaDoc, podobně jako u kompilátoru javac, je nyní při výstupu chyby uvedeno číslo problematického řádku v zdrojovém souboru a místo chyby.
- Bylo přidáno vlastnost native.encoding, která odráží název systémového kódování znaků (UTF-8, koi8-r, cp1251 atd.).
- Bylo přidáno rozhraní java.time.InstantSource, které umožňuje manipulaci s časem bez vazby na časové pásmo.
- Bylo přidáno API java.util.HexFormat pro konverzi na hexadecimální reprezentaci a zpět.
- Do kompilátoru byl přidán režim blackhole, který deaktivuje operace výjimek pro nevyužívaný kód (eliminace mrtvého kódu), což může být využito při provádění testů výkonnosti.
- Do Runtime byla přidána možnost „-Xlog:async“ pro zaznamenávání logů v asynchronním režimu.
- Při nastavování zabezpečených spojení je ve výchozím nastavení použit TLS 1.3 (dříve byl používán TLS 1.2).
- Bylo převedeno do kategorie plánovaných k odstranění dříve vyhlášené zastaralé API Applet (java.applet.Applet*, javax.swing.JApplet), používané k spouštění Java aplikací v prohlížeči (ztratilo aktuálnost po ukončení podpory Java pluginu pro prohlížeče).
- Bylo převedeno do kategorie plánovaných k odstranění Security Manager, který již dlouho ztratil aktuálnost a ukázal se jako nepotřebný po ukončení podpory prohlížečového pluginu.
- Byl odstraněn mechanismus RMI Activation, který se stal zastaralým, byl převeden na volbu již v Java 8 a téměř se nepoužívá v moderní praxi.
- Z SDK byl odstraněn experimentální kompilátor, který podporoval JIT (just-in-time) pro dynamickou kompilaci Java kódu pro HotSpot JVM, stejně jako režim anticipativní kompilace (AOT, ahead-of-time) tříd do strojového kódu před spuštěním virtuálního stroje. Kompilátor byl napsán v Javě a byl založen na vývojových pracích projektu Graal. Je uvedeno, že údržba kompilátoru vyžaduje velké pracovní úsilí, které se v podmínkách nedostatečné poptávky po vývojářích neospravedlňuje.
Zdroj: opennet.ru
