Po šestih mesecih razvoja je podjetje Oracle objavilo platformo Java SE 23 (Java Platform, Standard Edition 23), katere referenčna implementacija se uporablja v odprtem projektu OpenJDK. S postopnim odstranjevanjem nekaterih zastarelih možnosti v Java SE 23 je bila ohranjena nazaj združljivost s prejšnjimi različicami platforme Java — večina prej napisanih Java projektov bo še vedno delovala brez sprememb na novi različici. Gotove zbirke Java SE 22 (JDK, JRE in Server JRE) so na voljo 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 omogočajo dinamično povezovanje s komercialnimi izdelki.
Java SE 23 spada med različice z običajno podporo, katere posodobitve bodo izdane do naslednje različice. Kot veje z dolgo podporo (LTS) je priporočljivo uporabiti Java SE 21 ali Java SE 17, katere posodobitve bodo na voljo do leta 2031 in 2029, ustrezno (javne posodobitve do leta 2028 in 2026). Podaljšana podpora za LTS vejo Java SE 8 bo trajala do leta 2030, Java SE 11 pa do leta 2032.
Med novostmi, uvedenimi v Java SE 23, so:
- Privzeto je vključen generativni način delovanja zbiralnika smeti ZGC (Generational Z Garbage Collector), ki uporablja ločeno obdelavo 'starih' in 'mladih' objektov, kar povečuje učinkovitost čiščenja nedavno ustvarjenih objektov z majhno življenjsko dobo. Uporaba Generational ZGC zmanjšuje tveganja za ustavitve med dodeljevanjem virov, zmanjšuje obremenitev CPU in porabo pomnilnika pri zbiranju smeti. Testiranje Generational ZGC z Apache Cassandra 4 je pokazalo štirikratno povečanje prepustnosti pri fiksni velikosti kupčka in zmanjšanje velikosti kupčka za četrtino pri enaki prepustnosti.
- V JavaDoc je bila dodana podpora za uporabo Markdown oznake za dokumentiranje kode v komentarjih, ki jo je mogoče uporabiti namesto mešanice HTML in @-oznak JavaDoc.

- Mehanizmi uparjanja su prošireni unapred podržanom upotrebom primitivnih tipova (int, byte, char i drugih osnovnih tipova koji nisu objekti) u svim vrstama šablona, u operatoru „instanceof“ i u blokovima „switch“. switch (x.getStatus()) { case 0 -> „u redu“; case 1 -> „upozorenje“; case 2 -> „greška“; case int i -> „nepoznat status: „ + i; } if (i instanceof byte b) { … b … }
- Dodana je unapred podrška za korišćenje jednog izraza „import module M“ za uvoz svih paketa koje izlaže dati modul. Ova promena značajno pojednostavljuje ponovno korišćenje modula biblioteka, omogućavajući povezivanje biblioteka i klasa bez navođenja njihovog mesta u hijerarhiji paketa. Na primer, navođenje „import module java.base“ dovodi do uvoza svih 54 paketa koji su deo modula java.base, a koje bi ranije bilo potrebno posebno spominjati („import java.io.*“, „import java.util.*“ itd.).
Predložena je druga unapred realizacija API-a Class-File za analizu, generisanje i konvertovanje Java klasa. 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); } } });
- Predložena je osma unapred realizacija API-a Vector, koja pruža funkcije za vektorske proračune, koji se vrše korišćenjem vektorskih instrukcija procesora x86_64 i AArch64 i omogućavaju istovremeno primenu operacija na više vrednosti (SIMD). Za razliku od mogućnosti automatske vektorizacije skalarnih operacija koje pruža JIT kompajler HotSpot, novi API omogućava eksplicitno upravljanje vektorizacijom za paralelnu obradu podataka.
- U klasu java.io.Console dodate su metode format, printf, readPassword i readLine za formatiranje, ispis i čitanje teksta uzimajući u obzir odabranu lokalizaciju. System.console().printf(Locale.FRANCE, „%1$tY-%1$tB-%1$te %1$tA“, new Date()) 2024-maj-16 четвртак
- Dodana je druga preliminarna verzija proširenog API-ja Stream, koja podržava definisanje sopstvenih međufaznih operacija koje mogu biti korisne kada postojeće ugrađene međufazne operacije nisu dovoljne za željenu transformaciju podataka. Sopstveni rukovaoci se povezuju putem nove međufazne operacije Stream::gather(Gatherer), koja obrađuje elemente toka primenjujući na njih korisnički definisani rukovalac. 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 verzija neimplicitno deklarisanih klasa i anonimnih instanci metode „main“, u kojima je moguće zaobići deklaracije public/static, prosleđivanje niza argumenata i druge entitete povezane sa deklaracijom klase. \/\/ bilo je public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } \/\/ sada može void main() { System.out.println("Hello, World!"); }
- Dodana je druga preliminarna verzija mogućnosti koja omogućava navođenje u konstruktorima izraza pre poziva super(…), korišćenog za eksplicitno pozivanje konstruktora roditeljske klase iz konstruktora nasleđene klase, ako ti izrazi ne upućuju na instancu koju konstruktor kreira. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Dodana je treća preliminarna verzija ograničenih vrednosti (Scoped Values), koja omogućava zajedničko korišćenje neizmenljivih podataka u tokovima i efikasan prenos podataka između podtokova (vrednosti se nasleđuju). Scoped Values se razvijaju kao zamena za mehanizam promenljivih lokalnih za tok (thread-local variables) i efikasniji su pri korišćenju 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 upisuju jednom, kasnije ne mogu da se menjaju i ostaju dostupne samo tokom izvršenja toka.
- Predlagan je tretji predhodni različica API za strukturirano sočasnost (Structured Concurrency), ki poenostavi razvoj večnitnih aplikacij z obdelavo več nalog, izvedenih v različnih nitih, kot enotne enote.
- Metode dostopa do zunanjih pomnilnikov (izven JVM), ki jih zagotavlja razred sun.misc.Unsafe, so razglašene za zastarele in načrtovane za odstranitev. Za dostop do pomnilnika zunaj kup avtoserviserja in interakcijo z zunanjim kodom se priporoča uporaba API VarHandle in API FFM (Foreign Function & Memory).
Dodatno je objavljeno posodobitev platforme za razvoj aplikacij z grafičnim vmesnikom JavaFX 23 in vključitev JIT prevajalnika GraalVM v glavni sklop Oracle JDK 23.
Prikazana je tudi nova različica univerzalne virtualne naprave GraalVM, ki podpira zagon aplikacij v JavaScriptu (Node.js), Pythonu, Rubyu, R, kakršnih koli jezikih za JVM (Java, Scala, Clojure, Kotlin) in jezikih, za katere je mogoče ustvariti bitno kodo LLVM (C, C++, Rust). Poleg podpore za JDK 23 je nova različica optimizirala porabo pomnilnika in velikost izvršne kode ter omogočila polno podporo orodjem za vgradnjo Python in WebAssembly v Java kodo z uporabo JIT prevajanja.
Izvor: opennet.ru

