Etter seks måneder med utvikling publiserte Oracle Java SE 23-plattformen (Java Platform, Standard Edition 23), som bruker åpen kildekode OpenJDK-prosjektet som referanseimplementering. Med unntak av fjerning av noen foreldede funksjoner, opprettholder Java SE 23 bakoverkompatibilitet med tidligere utgivelser av Java-plattformen - de fleste tidligere skrevne Java-prosjekter vil fungere uten endringer når de kjøres under den nye versjonen. Klar til å installere bygg av Java SE 22 (JDK, JRE og Server JRE) er forberedt for Linux (x86_64, AArch64), Windows (x86_64) og macOS (x86_64, AArch64). Java 23-referanseimplementeringen er utviklet av OpenJDK-prosjektet og er fullstendig åpen kildekode under GPLv2-lisensen, med GNU ClassPath-unntak som tillater dynamisk kobling med kommersielle produkter.
Java SE 23 er klassifisert som en vanlig støtteutgivelse og vil fortsette å motta oppdateringer til neste utgivelse. Long Term Support (LTS)-grenen bør være Java SE 21 eller Java SE 17, som vil motta oppdateringer frem til henholdsvis 2031 og 2029 (vanligvis tilgjengelig til 2028 og 2026). Utvidet støtte for LTS-grenen til Java SE 8 vil vare til 2030, og Java SE 11 til 2032.
Blant de 23 innovasjonene som er foreslått i Java SE:
- Den generative driftsmodusen til ZGC (Generation Z Garbage Collector) søppeloppsamleren er aktivert som standard, ved bruk av separat behandling av "gamle" og "unge" objekter, noe som øker effektiviteten ved å rydde opp nylig opprettede objekter med kort levetid. Bruk av Generational ZGC reduserer risikoen for stopp under ressursallokering, reduserer CPU-belastning og minneforbruk under søppelhenting. Testing av Generational ZGC med Apache Cassandra 4 viste en 4x økning i gjennomstrømning med en fast haugstørrelse og en kvart reduksjon i haugstørrelse med konstant gjennomstrømning.
- JavaDoc har lagt til støtte for bruk av Markdown for å dokumentere kode i kommentarer, som kan brukes i stedet for en blanding av HTML og JavaDoc @-tagger.

- Mønstertilpasningsmekanismer har blitt forbedret med foreløpig støtte for bruk av primitive typer (int, byte, char og andre ikke-objekt grunnleggende typer) i alle slags maler, i "instanceof"-setningen og i "switch"-blokker. switch (x.getStatus()) { case 0 -> "okay"; sak 1 -> "advarsel"; sak 2 -> "feil"; case int i -> "ukjent status:" + i; } if (i forekomst av byte b) { … b … }
- Lagt til foreløpig støtte for å bruke en enkelt "importmodul M"-setning for å importere alle pakker eksportert av en spesifisert modul samtidig. Endringen forenkler gjenbruken av modulære biblioteker betydelig, slik at du kan inkludere biblioteker og klasser uten å bestemme deres plass i pakkehierarkiet. Hvis du for eksempel spesifiserer "import module java.base" vil du importere alle 54 pakkene som er inkludert i java.base-modulen, som tidligere ville ha måttet nevnes separat ("import java.io.*", "import java.util.* " osv.).
En annen foreløpig implementering av Class-File API er foreslått for å analysere, generere og konvertere Java-klassefiler. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce forekomst av MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
- Den åttende forhåndsvisningen av Vector API gir funksjoner for vektorberegninger som utføres ved hjelp av vektorinstruksjoner på x86_64- og AArch64-prosessorer og lar operasjoner brukes samtidig på flere verdier (SIMD). I motsetning til mulighetene gitt i HotSpot JIT-kompilatoren for autovektorisering av skalaroperasjoner, gjør det nye API-et det mulig å eksplisitt kontrollere vektorisering for parallell databehandling.
- Lagt format, printf, readPassword og readLine-metoder til java.io.Console-klassen for å formatere, vise og lese tekst basert på den valgte lokaliteten. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", ny Dato()) 2024-mai-16 jeudi
- En andre forhåndsvisningsimplementering av den utvidede Stream API er lagt til som støtter å definere dine egne mellomoperasjoner, noe som kan være nyttig i tilfeller der eksisterende innebygde mellomoperasjoner ikke er tilstrekkelig for ønsket datatransformasjon. Innfødte behandlere kobles til ved hjelp av den nye mellomoperasjonen Stream::gather(Gatherer), som behandler strømelementer ved å bruke en brukerspesifisert behandler på dem. 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]]
- Lagt til en tredje foreløpig implementering av implisitt deklarerte klasser og ikke navngitte forekomster av "hoved"-metoden, som kan unnlate offentlige/statiske deklarasjoner, sende en rekke argumenter og andre enheter knyttet til en klasseerklæring. // var offentlig klasse HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nå kan du annullere main() { System.out.println("Hei, verden!"); }
- Lagt til en andre forhåndsvisning av en funksjon som lar konstruktører spesifisere uttrykk før de kaller super(...), brukes til å eksplisitt kalle en overordnet klasses konstruktør fra en arvet klasses konstruktør hvis disse uttrykkene ikke refererer til en forekomst opprettet av konstruktøren. klasse Ytre { void hello() { System.out.println("Hei"); } klasse Indre { Indre() { hallo(); super(); } } }
- Lagt til en tredje forhåndsvisningsimplementering av Scoped Values, slik at uforanderlige data kan deles på tvers av tråder og data utveksles effektivt mellom underordnede tråder (verdier arves). Scoped Values blir utviklet for å erstatte tråd-lokale variabler-mekanismen og er mer effektive når du bruker svært store antall virtuelle tråder (tusenvis eller millioner av tråder). Hovedforskjellen mellom Scoped Values og trådlokale variabler er at de førstnevnte er skrevet én gang, ikke kan endres i fremtiden, og forblir bare tilgjengelige så lenge tråden kjøres.
- En tredje forhåndsvisning av Structured Concurrency API har blitt foreslått for testing, og forenkler utviklingen av flertrådede applikasjoner ved å behandle flere oppgaver som kjører i forskjellige tråder som en enkelt blokk.
- De eksterne minnetilgangsmetodene (utenfor JVM) levert av sun.misc.Unsafe-klassen er avviklet og planlagt for fjerning. For å få tilgang til off-heap-minne og samhandle med ekstern kode, anbefales det å bruke VarHandle API og FFM (Foreign Function & Memory) API.
I tillegg kan vi legge merke til publiseringen av en oppdatering til plattformen for å lage applikasjoner med det grafiske grensesnittet JavaFX 23 og inkluderingen av GraalVM JIT-kompilatoren i hoved Oracle JDK 23.
Også presentert er en ny utgivelse av den universelle virtuelle maskinen GraalVM, som støtter kjørende applikasjoner i JavaScript (Node.js), Python, Ruby, R, alle språk for JVM (Java, Scala, Clojure, Kotlin) og språk som LLVM-bitkode kan genereres (C , C++, Rust). I tillegg til å støtte JDK 23, optimaliserer den nye versjonen minneforbruket og størrelsen på kjørbar kode, og gir full støtte for verktøy for å bygge inn Python og WebAssembly i Java-kode ved hjelp av JIT-kompilering.
Kilde: opennet.ru

