Po šestih mesecih razvoja je podjetje Oracle objavilo platformo Java SE 23 (Java Platform, Standard Edition 23), ki uporablja odprti projekt OpenJDK kot referenčno implementacijo. Razen odstranitve nekaterih zastarelih funkcij v Java SE 23, je ohranjena združljivost z prejšnjimi različicami platforme Java – večina prej napisanih Java projektov bo delovala brez sprememb pri zagonu pod novo različico. Pripravljene za namestitev gradnje Java SE 22 (JDK, JRE in Server JRE) so pripravljene za Linux (x86_64, AArch64), Windows (x86_64) in macOS (x86_64, AArch64). Referenčna implementacija Java 23, razvita v okviru projekta OpenJDK, je popolnoma odprta pod licenco GPLv2 z izjemami GNU ClassPath, ki dovoljujejo dinamično povezovanje s komercialnimi izdelki.
Java SE 23 spada med različice z običajno podporo, posodobitve katerih bodo izdane do naslednje izdaje. Kot veja z dolgo podporo (LTS) je treba uporabljati Java SE 21 ali Java SE 17, katerih posodobitve bodo izdane do leta 2031 in 2029 (javne – do leta 2028 in 2026). Podaljšana podpora LTS veji Java SE 8 se bo nadaljevala do leta 2030, Java SE 11 pa do leta 2032.
Med novostmi, ki jih prinaša Java SE 23, so:
- Privzeto je vključen generativni način delovanja zbiralnika smeti ZGC (Generational Z Garbage Collector), ki uporablja ločeno obdelavo 'starejših' in 'mlajših' objektov, kar povečuje učinkovitost čiščenja nedavno ustvarjenih objektov z majhno življenjsko dobo. Uporaba Generational ZGC zmanjšuje tveganje za zaustavitve med dodeljevanjem virov, zmanjšuje obremenitev CPU in porabo pomnilnika pri zbiranju smeti. Testiranje Generational ZGC z Apache Cassandra 4 je pokazalo povečanje prepustnosti za štirikrat pri fiksni velikosti kupčka (heap) in zmanjšanje velikosti kupčka za četrtino pri nespremenjeni prepustnosti.
- JavaDoc zdaj podpira uporabo Markdown oznak za dokumentiranje kode v komentarjih, ki jih je mogoče uporabiti namesto mešanice HTML in @-oznak JavaDoc.

- Mehanizmi usklajevanja so izboljšani z vnaprej podporo za uporabo primitivnih tipov (int, byte, char in drugi osnovni tipi, ki niso objekti) v vseh vrstah predlog, v operatorju „instanceof“ in v blokih „switch“. switch (x.getStatus()) { case 0 -> „v redu“; case 1 -> „opozorilo“; case 2 -> „napaka“; case int i -> „neznan status: “ + i; } if (i instanceof byte b) { … b … }
- Dodana je vnaprejšnja podpora za uporabo izraza „import module M“ za hkratno uvažanje vseh paketov, ki jih izvaža določen modul. Sprememba znatno poenostavi ponovno uporabo modulskih knjižnic, saj omogoča vključitev knjižnic in razredov brez potrebe po določanju njihovega mesta v hierarhiji paketov. Na primer, navedba „import module java.base“ bo pripeljala do uvoza vseh 54 paketov, ki jih vsebuje modul java.base, ki bi jih prej bilo treba omenjati posebej („import java.io.*“, „import java.util.*“ itd.).
Predlagana je druga vnaprejšnja različica API-ja Class-File za razčlenitev, generiranje in preoblikovanje datotek razredov Java. 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().startsWith(„debug“))) { classBuilder.with(ce); } } });
- Predlagana je osma vnaprejšnja različica API-ja Vector, ki nudi funkcije za vektorske izračune, ki se izvajajo z uporabo vektorskih ukazov procesorjev x86_64 in AArch64 in omogočajo hkratno uporabo operacij na več vrednostih (SIMD). V nasprotju z zmogljivostmi samodejnega vektoriziranja skalarnih operacij, ki jih nudi JIT-kompilator HotSpot, nov API omogoča jasno upravljanje vektorizacije za paralelno obdelavo podatkov.
- Metode format, printf, readPassword in readLine so v razred java.io.Console dodane za oblikovanje, izpis in branje besedila ob upoštevanju izbrane lokalizacije. System.console().printf(Locale.FRANCE, „%1$tY-%1$tB-%1$te %1$tA“, new Date()) 2024-mai-16 jeudi
- Dodana je druga preliminarna realizacija proširenog API-ja Stream, koja podržava definisanje vlastitih međuprogramskih operacija koje mogu biti korisne u slučajevima kada postojeće ugrađene međuprogramske operacije nisu dovoljne za željenu transformaciju podataka. Vlastiti obrađivači se priključuju pomoću nove međuprogramske operacije Stream::gather(Gatherer), koja obrađuje elemente strujanja primenjujući na njih odabranog korisničkog obrađivača. 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]]
- Dodana je treća preliminarna realizacija implicitno deklarisanih klasa i anonimnih instanci metode „main“, u kojima se može obaviti bez deklaracija public/static, prenosa niza argumenata i drugih entiteta povezanih s deklaracijom klase. // bilo public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // sada se može void main() { System.out.println("Hello, World!"); }
- Dodata je druga preliminarna verzija mogućnosti, koja omogućava navođenje izraza u konstruktorima pre poziva super(…), koji se koristi za eksplicitno pozivanje konstruktora roditeljske klase iz konstruktora nasleđene klase, ako se ti izrazi ne odnose na instancu koju konstruktor stvara. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Dodana je treća preliminarna realizacija ograničenih vrednosti (Scoped Values), koja omogućava deljenje nepromenljivih podataka u tokovima i efikasan prenos podataka između pod-tokova (vrednosti se nasleđuju). Scoped Values se razvijaju kao zamena za mehanizam promenljivih lokalnih za tok (thread-local variables) i efikasnije su prilikom korišćenja veoma velikog broja virtuelnih tokova (hiljade i milioni tokova). Glavna razlika između Scoped Values i promenljivih lokalnih za tok je u tome što se prve beleže jednom, dalje se ne mogu menjati i ostaju dostupne samo tokom izvršenja toka.
- Predlagan je tretji osnutek API za strukturirano sočasnost (Structured Concurrency), ki poenostavi razvoj večnitenjskih aplikacij z obravnavo več nalog, ki se izvajajo v različnih niti, kot enotne enote.
- Metode dostopa do zunanjega pomnilnika (izven JVM), ki jih nudi razred sun.misc.Unsafe, so razglašene za zastarele in predvidene za odstranitev. Za dostop do pomnilnika izven kupice (off-heap) in interakcijo z zunanjim kodo se priporoča uporaba API-ja VarHandle in API-ja FFM (Foreign Function & Memory).
Dodatno je bila objavljena posodobitev platforme za ustvarjanje aplikacij z grafičnim vmesnikom JavaFX 23 in vključitev JIT prevajalnika GraalVM v glavno različico Oracle JDK 23.
Predstavljen je tudi nov izdelek univerzalne virtualne mašine GraalVM, ki podpira zagon aplikacij v JavaScriptu (Node.js), Pythonu, Rubyju, R, ter v vseh jezikih za JVM (Java, Scala, Clojure, Kotlin) in jezikih, za katere je možno oblikovati bitno kodo LLVM (C, C++, Rust). Poleg podpore JDK 23 je nova različica optimizirala porabo pomnilnika in velikost izvršljive kode, ter omogočila polno podporo orodjem za vgradnjo Python in WebAssembly v Java kodo z uporabo JIT prevajanja.
Izvor: opennet.ru

