Po šesti měsících vývoje společnost Oracle vydala platformu Java SE 16 (Java Platform, Standard Edition 16), jejíž referenční implementací je otevřený projekt OpenJDK. V Java SE 16 byla zachována zpětná kompatibilita s předchozími verzemi platformy Java, všechny dříve napsané Java projekty budou bez změn fungovat pod novou verzí. Připravené instalační balíčky Java SE 16 (JDK, JRE a Server JRE) jsou dostupné pro Linux (x86_64, AArch64), Windows a macOS. Referenční implementace Java 16 vyvinutá v rámci projektu OpenJDK je zcela otevřena pod licencí GPLv2 s výjimkami GNU ClassPath, které povolují dynamické propojení s komerčními produkty.
Java SE 16 je zařazena do kategorie verzí s obvyklou dobou podpory, aktualizace pro ni budou vydávány do dalšího vydání. Pro dlouhodobou podporu (LTS) by se měla používat Java SE 11, jejíž aktualizace budou vydávány do roku 2026. Další LTS vydání je plánováno na září 2021. Připomínáme, že od vydání Java 10 projekt přešel na nový proces vývoje, který zahrnuje kratší cyklus tvorby nových verzí. Nové funkce se nyní vyvíjejí v jedné neustále aktualizované master větvi, do které jsou zařazeny 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í.
Při přípravě nového vydání byla vývoj přenesen ze systému správy verzí Mercurial na Git a platformu pro spolupráci GitHub. Očekává se, že migrace zvýší výkon operací s repozitářem, zlepší efektivitu ukládání, poskytne přístup ke změnám v celé historii projektu, zlepší podporu revizí kódu a umožní využívání API pro automatizaci pracovních procesů. Kromě toho používání Git a GitHub činí projekt atraktivnějším pro nováčky a vývojáře zvyklé na Git.
Mezi novinkami Java 16 lze zmínit:
- Byl přidán experimentální modul jdk.incubator.vector s implementací API Vector, který poskytuje funkce pro vektorové výpočty prováděné pomocí vektorových instrukcí procesorů x86_64 a AArch64 a umožňuje aplikovat operace na více hodnot současně (SIMD). Na rozdíl od funkcí, které poskytuje JIT kompilátor HotSpot pro automatickou vektorization skalarových operací, nové API umožňuje explicitní řízení vektorization pro paralelní zpracování dat.
- V kódu JDK a VM HotSpot, napsaném v C++, je povoleno používat funkce uvedené ve specifikaci C++14. Dříve bylo povoleno používat standardy C++98/03.
- Do sběrače odpadu ZGC (Z Garbage Collector), který pracuje v pasivním režimu a snaží se co nejvíce minimalizovat zpoždění způsobené sběrem odpadu, byla přidána možnost paralelního zpracování zásobníků vláken bez přerušení vykonávání vláken aplikace. V ZGC nyní zůstaly pouze operace, které vyžadují pozastavení činnosti, jež mají trvalá zpoždění, obvykle nepřesahující několik set mikrosekund.
- Do tříd SocketChannel, ServerSocketChannel a java.nio.channels byla přidána podpora Unix-socketů (AF_UNIX).
- Byl realizován port pro linuxovou distribuci Alpine se standardní C knihovnou musl, která je oblíbená v prostředích pro kontejnery, mikroslužby, cloudové a vestavěné systémy. Navržený port v těchto prostředích umožňuje spouštět aplikace v Javě jako běžné aplikace. Kromě toho je možné pomocí jlink odstranit všechny nepoužívané moduly a vytvořit minimální prostředí nezbytné pro vykonávání aplikace, což umožňuje vytvářet specifické pro konkrétní aplikace kompaktní obrazy.
- Byl realizován mechanismus Elastic Metaspace, optimalizující operace alokace a uvolnění paměti zabírané metadaty tříd (metaspace) v JVM HotSpot. Použití Elastic Metaspace snižuje fragmentaci paměti, snižuje režijní náklady ve správci tříd, a také pozitivně ovlivňuje výkon dlouho běžících serverových aplikací díky rychlejšímu vrácení paměti systému operačnímu systému zabrané nepoužívanými metadaty tříd. Pro výběr režimu uvolňování paměti po uvolnění tříd byla navržena možnost „-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)“.
- Byl přidán port JDK pro systémy Windows běžící na hardwaru s procesory architektury AArch64.
- Byla navržena třetí předběžná verze API Foreign-Memory Access, která umožňuje aplikacím Java bezpečně a efektivně přistupovat k oblastem paměti mimo Java hromadu pomocí nových abstrakcí MemorySegment, MemoryAddress a MemoryLayout.
- Bylo implementováno experimentální API Foreign Linker, které poskytuje přístup z Java k nativnímu kódu. Spolu s API Foreign-Memory výrazně usnadňuje vytváření obalů kolem běžných sdílených knihoven.
- Byl přidán nástroj jpackage, který umožňuje vytvářet balíčky pro samostatné Java aplikace. Nástroj je založen na javapackageru z JavaFX a umožňuje vytváření balíčků ve formátech nativních pro různé platformy (msi a exe pro Windows, pkg a dmg pro macOS, deb a rpm pro Linux). Balíčky obsahují všechny potřebné závislosti.
- Byla ve výchozím nastavení zahrnuta přísná enkapsulace všech vnitřních prvků JDK kromě kritických API, jako je sun.misc.Unsafe. Hodnota volby "--illegal-access" je nyní ve výchozím nastavení nastavena na "deny" místo "permit", což povede k zablokování pokusů o přístup k většině vnitřních tříd, metod a polí z kódu. Pro obcházení této omezení by se měla používat volba "--illegal-access=permit".
- Byla stabilizována implementace pattern matching v operátoru "instanceof", která umožňuje okamžitě definovat lokální proměnnou pro přístup k ověřené hodnotě. Například lze psát "if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}" bez explicitního určení "String s = (String) obj". Bylo: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Nyní se obejdete bez určení "Group group = (Group) obj": if (obj instanceof Group group) { var entries = group.getEntries(); }
- Byla stabilizována implementace klíčového slova „record“, která poskytuje kompaktní formu pro definici tříd, umožňující obejít se bez explicitního určení různých nízkoúrovňových metod, jako jsou equals(), hashCode() a toString(), v případech, kdy jsou data uložena pouze v polích, jejichž chování se nemění. Když se v třídě používají typové implementace metod equals(), hashCode() a toString(), lze se obejít bez jejich explicitního určení: public record BankTransaction(LocalDate date, double amount, String description) {}
Toto prohlášení povede k automatickému přidání implementací metod equals(), hashCode() a toString() spolu s konstruktorem a metodami, které kontrolují změnu dat (getter).
- Byl navržen druhý předběžný návrh uzavřených („sealed“) tříd a rozhraní, které nemohou být použity 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žití nadřazené třídy než modifikátory přístupu, založený na výslovném vyjmenování podtříd povolených k rozšíření. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
Zdroj: opennet.ru
