PĂ€rast kuue kuu arendust on Oracle vĂ€lja andnud Java SE 23 platvormi (Java Platform, Standard Edition 23), mille etalonrakenduseks on avatud projekt OpenJDK. VĂ€lja arvatud mĂ”ned aegunud funktsioonide eemaldamine, sĂ€ilitab Java SE 23 tagasiĂŒhilduvuse eelmiste versioonidega - enamik varasemalt kirjutatud Java projekte töötab uue versiooni all ilma muudatusteta. Valmis installeeritavad Java SE 22 (JDK, JRE ja Server JRE) paketid on ette valmistatud Linuxile (x86_64, AArch64), Windowsile (x86_64) ja macOSile (x86_64, AArch64). OpenJDK projekti raames vĂ€lja töötatud Java 23 etalonrakendus on tĂ€ielikult avatud GPLv2 litsentsi all koos GNU ClassPathi eranditega, mis lubavad dĂŒnaamilist sidumist kaubanduslike toodetega.
Java SE 23 kuulub tavapÀrase toe vÀljalaskesse, mille vÀrskendusi antakse vÀlja jÀrgmise vÀljalaske kuni. Pikaajalise toe (LTS) haruna tuleks kasutada Java SE 21 vÔi Java SE 17, mille vÀrskendusi antakse vÀlja vastavalt kuni 2031. ja 2029. aastani (avalikud - kuni 2028. ja 2026. aastani). LTS-haru Java SE 8 pikendatud toetus kestab kuni 2030. aastani, samas kui Java SE 11 toetus kestab kuni 2032. aastani.
Java SE 23s pakutud uuenduste hulgas:
- Vaikimisi on aktiveeritud Generational ZGC (Generational Z Garbage Collector) jÀÀtme kogumise generatiivne reĆŸiim, mis kasutab âvanadeâ ja ânoorteâ objektide eraldi töötlemist, mis suurendab hiljuti loodud objektide efektiivsust, millel on lĂŒhike eluiga. Generational ZGC kasutamine vĂ€hendab riske ressursside jaotamise ajal, vĂ€hendab CPU koormust ja mĂ€lutarbimist prĂŒgikogumise ajal. Generational ZGC testimine Apache Cassandra 4-ga nĂ€itas, et jĂ”udlus suurenes neli korda fikseeritud hunniku (heap) suuruse juures ja hunniku suurus vĂ€henes neljandiku vĂ”rra konstantsel jĂ”udlusel.
- JavaDocis on lisatud tugi Markdowni mÀrgistamise kasutamiseks koodi dokumentimiseks kommentaarides, mida saab kasutada HTML ja @-siltide segu asemel JavaDocis.

- Mudeli vasteid on laiendatud esialgse toe vĂ”imaldamisega primitiivsete tĂŒĂŒpide (int, byte, char ja muud baastĂŒĂŒbid, mis ei ole objektid) kasutamiseks kĂ”igis ŃĐ°Đ±Đ»ĐŸĐœides, ĐŸĐżĐ”ŃаŃĐŸŃĐž «instanceof» ja «switch» blokides. switch (x.getStatus()) { case 0 -> «okay»; case 1 -> «warning»; case 2 -> «error»; case int i -> «unknown status: » + i; } if (i instanceof byte b) { ⊠b ⊠}
- Lisatud on esialgne tugi kasutada ĂŒhte vĂ€ljendit «import module M» kĂ”igi pakettide importimiseks, mida antud moodul eksportib. Muudatus lihtsustab oluliselt moodulite raamatukogude taaskasutamist, vĂ”imaldades raamatukogude ja klasside ĂŒhendamist ilma nende asukoha mÀÀramata pakettide hierarhias. NĂ€iteks «import module java.base» toob sisse kĂ”ik 54 paketti, mis kuuluvad java.base moodulisse, mis varem tuli eraldi mainida («import java.io.*», «import java.util.*» jne).
Pakutud on teise eelversiooni Class-File API-st, mis vÔimaldab Java klassifailide koostamist, genereerimist ja muutmist. 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); } } });
- Pakutud on kaheksas eelversioon Vector API-st, mis pakub vektorite arvutamise omadusi, mis on ĂŒles ehitatud x86_64 ja AArch64 protsessorite vektori juhiste kasutamisele ning vĂ”imaldavad korraga rakendada operatsioone mitme vÀÀrtuse (SIMD) suhtes. Erinevalt JIT-kompilaatori HotSpot-ist pakutavast automaatvektoriseerimisest skalaarselt, annab uus API vĂ”imaluse selgelt hallata vektoriseerimist andmete paralleelseks töötlemiseks.
- Java klassi java.io.Console on lisatud meetodid format, printf, readPassword ja readLine, et vormindada, vÀljundada ja lugeda teksti vastavalt valitud lokaadile. System.console().printf(Locale.FRANCE, «%1$tY-%1$tB-%1$te %1$tA», new Date()) 2024-mai-16 jeudi
- Lisatud on teine eelnĂ”u laiendatud API Stream, mis toetab kasutaja mÀÀratud vaheoperatsioonide mÀÀratlemist, mis vĂ”ivad osutuda kasulikuks olukordades, kus olemasolevad sisseehitatud vaheoperatsioonid ei ole piisavad soovitud andmete muundamiseks. Kasutaja mÀÀratud töötlejad ĂŒhendatakse uue vaheoperatsiooniga Stream::gather(Gatherer), mis töötleb voogude elemente, rakendades neile mÀÀratud töötlejat. 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]]
- Lisatud on kolmas eelnĂ”u vaikimisi deklareeritud klasside ja anonĂŒĂŒmsete instantside meetodist "main", kus saab hakkama ilma public/static deklaratsioonide, argumentide massiivi edastamise ja muude klasside deklareerimisega seotud elementideta. // enne public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nĂŒĂŒd saab void main() { System.out.println("Hello, World!"); }
- Lisatud on teine eelnÔu, mis vÔimaldab konstruktorites mÀÀrata vÀljendeid enne super(...) kutsumist, mida kasutatakse vanema klassi konstruktori selgesÔnaliseks kutsumiseks jÀreltulija klassi konstruktorist, kui need vÀljendid ei viita konstruktoriga loodud instantsile. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Lisatud on kolmas eelnĂ”u piiratud vÀÀrtuste (Scoped Values) rakendamisest, mis vĂ”imaldavad jagada muutumatuid andmeid voogudes ja tĂ”husalt edastada teavet alamvoogude vahel (vÀÀrtused pĂ€rinevad). Piiratud vÀÀrtused on vĂ€lja töötatud, et asendada voogudega seotud lokaalsed muutujad (thread-local variables) ja need on tĂ”husamad, kui kasutada vĂ€ga suurt arvu virtuaalvooge (tuhanded ja miljonid vood). Peamine erinevus piiratud vÀÀrtuste ja voogu kohalike muutujate vahel on see, et esimesed kirjutatakse sisse ĂŒks kord, neid ei saa enam muuta ja need on kergesti kĂ€tte saadavad ainult voogude tĂ€itmise ajal.
- Kolmandat eelvaadet API-st, mis toetab struktureeritud paralleelsust (Structured Concurrency), on testimiseks pakutud. See lihtsustab mitme lĂ”imega rakenduste arendamist, kĂ€sitledes erinevates lĂ”imedes tĂ€idetavaid ĂŒlesandeid kui ĂŒhtset blokki.
- Klassi sun.misc.Unsafe poolt pakutud vÀlise mÀlu (vÀljaspool JVM) juurde pÀÀsemise meetodid on kuulutatud aegunuks ja plaanitakse eemaldada. VÀlise mÀluga (off-heap) töötamiseks ja vÀlise koodiga suhtlemiseks soovitatakse kasutada API-d VarHandle ja API-d FFM (Foreign Function & Memory).
Lisaks vÔib mÀrkida, et on avaldatud vÀrskendus JavaFX 23 rakenduste loomiseks ja GraalVM JIT-kompilaatori kaasamine Oracle JDK 23 pÔhikomplekti.
Esitletud on ka uus GraalVM universaalse virtuaalmasina versioon, mis toetab rakenduste kÀivitamist JavaScriptis (Node.js), Pythonis, Ruby's, R-is, kÔigis JVM-i keeltes (Java, Scala, Clojure, Kotlin) ning keeltes, mille jaoks saab genereerida LLVM bitikoodi (C, C++, Rust). Uues versioonis on toimunud mÀlutarbimise ja tÀidetava koodi suuruse optimeerimine, samuti on tÀielikult toetatud Python'i ja WebAssembly integreerimise tööriistade rakendamine Java koodis JIT-kompilaatorit kasutades.
Allikas: opennet.ru

