Vydání platformy Java SE 22 a otevřené referenční implementace OpenJDK 22

Po šesti měsících vývoje vydala společnost Oracle platformu Java SE 22 (Java Platform, Standard Edition 22), která jako referenční implementaci využívá open source projekt OpenJDK. S výjimkou odstranění některých zastaralých funkcí si Java SE 22 zachovává zpětnou kompatibilitu s předchozími verzemi platformy Java – většina dříve napsaných projektů Java bude při spuštění v nové verzi stále fungovat bez úprav. Sestavení Java SE 22 (JDK, JRE a Server JRE) připravená k instalaci jsou připravena pro Linux (x86_64, AArch64), Windows (x86_64) a macOS (x86_64, AArch64). Referenční implementace Java 22, vyvinutá projektem OpenJDK, je plně open source pod licencí GPLv2 s výjimkami GNU ClassPath, které umožňují dynamické propojení s komerčními produkty.

Java SE 22 je klasifikována jako běžná verze podpory a bude i nadále dostávat aktualizace až do příští verze. Pobočka Long Term Support (LTS) by měla být Java SE 21 nebo Java SE 17, které budou dostávat aktualizace do roku 2031, respektive 2029 (obecně dostupné do roku 2028 a 2026). Veřejná podpora pro LTS větev Java SE 11 skončila loni v září, ale prodloužená podpora bude pokračovat až do roku 2032. Rozšířená podpora pro LTS větev Java SE 8 bude pokračovat až do roku 2030.

Připomeňme, že počínaje vydáním Javy 10 přešel projekt na nový vývojový proces, což znamená kratší cyklus tvorby nových verzí. Nové funkce jsou nyní vyvíjeny v jedné neustále aktualizované hlavní větvi, která zahrnuje hotové změny a ze které se větve každých šest měsíců rozvětvují, aby se stabilizovala nová vydání.

Mezi nové funkce v Javě 22 patří:

  • G1 garbage collector zahrnuje podporu pro připínání regionů, což vám umožňuje dočasně opravit umístění objektů Java v paměti, abyste zabránili jejich přesunutí garbage collectorem a umožnili bezpečné předávání odkazů na tyto objekty mezi Java a nativním kódem. Připínání vám umožňuje snížit latenci a vyhnout se deaktivaci shromažďování odpadků při spouštění kritických oblastí JNI (Java Native Interface) s nativním kódem (při spouštění těchto sekcí by JVM nemělo přesouvat kritické objekty, které jsou s nimi spojené, aby se předešlo konfliktním podmínkám). Připnutím se odstraní kritické objekty z pohledu sběrače odpadu, který může pokračovat v čištění nepřipnutých oblastí.
  • Byla přidána předběžná funkce, která umožňuje specifikovat výrazy v konstruktorech před voláním super(...), která se používá k explicitnímu volání konstruktoru nadřazené třídy ze zděděného konstruktoru třídy, pokud tyto výrazy neodkazují na instanci vytvořenou konstruktorem. class Outer { void hello() { System.out.println("Ahoj"); } class Inner { Inner() { hello(); super(); } } }
  • FFM (Foreign Function & Memory) API bylo stabilizováno, což umožňuje interakci programů Java s externím kódem a daty voláním funkcí z externích knihoven a přístupem k paměti mimo JVM, aniž by bylo nutné používat JNI (Java Native Interface).
  • Byla povolena podpora nepojmenovaných proměnných a porovnávání vzorů – místo nepoužívaných, ale nezbytných proměnných a vzorů při volání můžete nyní zadat znak „_“. // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // nyní můžete String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Pro analýzu, generování a převod souborů tříd Java je navržena předběžná implementace Class-File API. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). beginWith("debug"))) { classBuilder.with(ce); } } });
  • Obslužný program java poskytuje možnost spouštět programy Java, dodávané ve formě několika souborů kódu nebo předkompilovaných knihoven tříd, bez samostatného kompilování těchto souborů a bez konfigurace systému sestavení. Nová funkce usnadňuje spouštění programů, ve kterých je kód různých tříd rozdělen do samostatných souborů. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Ahoj!"); } }

    Například pro spuštění programu sestávajícího ze dvou souborů „Prog.java“ a „Helper.java“ nyní stačí spustit „java Prog.java“, který zkompiluje třídu Prog, definuje odkaz na třídu Helper, najít a zkompilovat soubor Helper.java a volání hlavní metody.

  • Přidána druhá předběžná implementace String Templates, implementovaná vedle řetězcových literálů a textových bloků. Řetězcové šablony umožňují kombinovat text s vypočítanými výrazy a proměnnými bez použití operátoru +. Náhrada výrazů se provádí pomocí substitucí \{..} a lze připojit speciální handlery pro kontrolu správnosti dosazovaných hodnot. Například modul SQL kontroluje hodnoty nahrazované do kódu SQL a jako výstup vrací objekt java.sql.Statement, zatímco procesor JSON monitoruje správnost substitucí JSON a vrací JsonNode. Řetězcový dotaz = "SELECT * FROM Osoba p WHERE p." + vlastnost + " = '" + hodnota + "'"; // byl Příkaz dotaz = SQL."""SELECT * FROM Osoba p WHERE p.\{vlastnost} = '\{hodnota}'"""; // stal se
  • Byl přidán sedmý náhled Vector API, který poskytuje funkce pro vektorové výpočty, které se provádějí pomocí vektorových instrukcí na procesorech x86_64 a AArch64 a umožňují použití operací současně na více hodnot (SIMD). Na rozdíl od možností, které poskytuje kompilátor HotSpot JIT pro automatickou vektorizaci skalárních operací, nové API umožňuje explicitně řídit vektorizaci pro paralelní zpracování dat.
  • Byla přidána předběžná implementace rozšířeného Stream API, která podporuje definování vašich vlastních zprostředkujících operací, což může být užitečné v případech, kdy stávající vestavěné zprostředkující operace nestačí pro požadovanou transformaci dat. Nativní obslužné rutiny jsou připojeny pomocí nové zprostředkující operace Stream::gather(Gatherer), která zpracovává prvky toku tak, že na ně aplikuje uživatelsky zadaný obslužný program. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • K testování byla navržena druhá verze experimentálního API pro strukturovanou souběžnost, která zjednodušuje vývoj vícevláknových aplikací zpracováním více úloh prováděných v různých vláknech jako jeden blok.
  • Přidána druhá předběžná implementace implicitně deklarovaných tříd a nepojmenovaných instancí metody „main“, která se obejde bez veřejných/statických deklarací, předávání pole argumentů a dalších entit spojených s deklarací třídy. // byla veřejná třída HelloWorld { public static void main(String[] args) { System.out.println("Ahoj světe!"); } } // nyní můžete void main() { System.out.println("Ahoj, světe!"); }
  • Přidána druhá ukázková implementace Scoped Values, která umožňuje sdílení neměnných dat napříč vlákny a efektivní výměnu dat mezi podřízenými vlákny (hodnoty se dědí). Scoped Values ​​jsou vyvíjeny, aby nahradily mechanismus lokálních proměnných vláken a jsou efektivnější při použití velkého počtu virtuálních vláken (tisíce nebo miliony vláken). Hlavní rozdíl mezi Scoped Values ​​​​a lokálními proměnnými vlákna je v tom, že první jsou zapsány jednou, nelze je v budoucnu změnit a zůstávají dostupné pouze po dobu provádění vlákna.
  • Parallel garbage collector má lepší výkon při práci s velkými poli objektů. Optimalizace umožnila v některých testech s velkými poli objektů zkrátit zpoždění před zahájením hledání objektu o 20 %.

Dále si můžete všimnout zveřejnění aktualizace platformy pro tvorbu aplikací s grafickým rozhraním JavaFX 22.

Zdroj: opennet.ru

Přidat komentář