Hat hónap fejlesztés után az Oracle kiadta a Java SE 20 (Java Platform, Standard Edition 20) platformot, amelynek referenciabeli megvalósítása az OpenJDK nyílt projekt. Kivéve néhány elavult funkció eltávolítását, a Java SE 20 megőrzi a visszafelé kompatibilitást a korábbi Java platform kiadásokkal — a korábban készült Java-projektek változtatások nélkül futtathatók az új verzió alatt. Az Linuxhoz (x86_64, AArch64), Windowshoz (x86_64) és macOS-hoz (x86_64, AArch64) telepíthető Java SE 20 (JDK, JRE és Server JRE) összeállításait készítették el. Az OpenJDK projekt keretein belül kifejlesztett referenciabeli megvalósítás teljes mértékben nyílt a GPLv2 licenc alatt, GNU ClassPath kivételekkel, amelyek lehetővé teszik a kereskedelmi termékekkel való dinamikus kötődést.
A Java SE 20 a normál támogatási időszakú kiadások közé tartozik, frissítések a következő kiadásig fognak megjelenni. Hosszú távú támogatási (LTS) ágnak a Java SE 17 használatát javasoljuk, amelynek frissítései 2029-ig fognak megjelenni. Emlékeztetőül, a Java 10 kiadásától kezdve a projekt új fejlesztési folyamatra váltott, amely rövidebb új kiadási ciklust feltételez. Az új funkciók immár egy folyamatosan frissített master-ágban fejlődnek, amelybe a már kész változások kerülnek, és amelyből hat havonta stabilizáló ágak ágaznak el az új kiadásokhoz.
A Java 20 újdonságai közül kiemelendők:
- Bevezetésre került a korlátozott értékek (Scoped Values) előzetes támogatása, amely lehetővé teszi az immutable adatok közös használatát folyamatokban, és hatékony adatcserét a gyermekfolyamatok között (az értékek öröklődnek). A Scoped Values a szál-specifikus változók (thread-local variables) mechanizmusának helyettesítésére fejlődnek, és hatékonyabbak az óriási számú virtuális szál (ezrek és milliók) használatakor. A legfőbb különbség a Scoped Values és a szál-specifikus változók között, hogy az előbbiek egyszer kerülnek rögzítésre, ezután nem módosíthatók, és csak a szál futása alatt érhetők el. class Server { final static ScopedValue CURRENT_USER = new ScopedValue(); void serve(Request request, Response response) { var level = (request.isAuthorized() ? ADMIN : GUEST); var user = new User(level); ScopedValue.where(CURRENT_USER, user) .run(() -> Application.handle(request, response)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); return new DBConnection(…); } }
- Bevezetésre került a második előzetes implementációs sablon (record pattern), amely kiterjeszti a Java 16-ban megjelenő mintaillesztési lehetőséget a record típusú osztályok értékeinek elemzésére. Például: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x + y); } }
- Bevezetésre került a negyedik előzetes implementáció a switch kifejezések mintázat-illesztésére, lehetővé téve a case címkékben nem pontos értékek, hanem rugalmas minták használatát, amelyek egyszerre lefedik a korábban csoportosított if…else láncokkal kezelt értékek sorozatát. static String formatterPatternSwitch(Object obj) { return switch (obj) { 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 -> obj.toString(); }; }
- Bevezetésre került a második előzetes implementáció az FFM (Foreign Function & Memory) API-ból, amely lehetővé teszi a Java programok és külső kódok, valamint adatok közötti interakciót külső könyvtárak funkcióinak hívásával és a JVM-en kívüli memória elérésével.
- A második előzetes megvalósítás hozzáadva a virtuális szálakhoz, amelyek könnyű szálak, jelentősen egyszerűsítve ezzel a nagy teljesítményű, több szálon futó alkalmazások írását és karbantartását.
- Hozzáadtuk a második változatát a kísérleti API-nak a strukturált párhuzamossághoz, amely megkönnyíti a több szálon működő alkalmazások fejlesztését azáltal, hogy a különböző szálakon végrehajtott több feladatot egy blokként kezel.
- Hozzáadva az ötödik előzetes megvalósítás az API Vector-hoz, amely funkciókat biztosít a vektorszámításokhoz, amelyeket az x86_64 és AArch64 processzorok vektoreltérő utasításaival hajtanak végre, lehetővé téve, hogy egyszerre több értékre is alkalmazhassunk műveleteket (SIMD). A HotSpot JIT-kompilátor által biztosított skáláris műveletek automatikus vektorizálási lehetőségeivel ellentétben az új API lehetőséget ad a vektorizálás kifejezett kezelésére párhuzamos adatfeldolgozás esetén.
Forrás: opennet.ru
