Java SE 22 -alustan ja OpenJDK 22:n avoimen viitetoteutuksen julkaisu

Kuuden kuukauden kehitystyön jälkeen Oracle julkaisi Java SE 22:n (Java Platform, Standard Edition 22), joka käyttää OpenJDK avoimen lähdekoodin projektia referenssitoteutuksena. Joidenkin vanhentuneiden ominaisuuksien poistamista lukuun ottamatta Java SE 22 säilyttää taaksepäin yhteensopivuuden Java-alustan aikaisempien julkaisujen kanssa - useimmat aiemmin kirjoitetut Java-projektit toimivat ilman muutoksia, kun ne suoritetaan uudessa versiossa. Java SE 22:n (JDK, JRE ja Server JRE) asennusvalmiit koontiversiot on valmistettu Linuxille (x86_64, AArch64), Windowsille (x86_64) ja macOS:lle (x86_64, AArch64). OpenJDK-projektin kehittämä Java 22 -viitetoteutus on täysin avoimen lähdekoodin GPLv2-lisenssin alainen GNU ClassPath -poikkeuksilla, jotka mahdollistavat dynaamisen linkityksen kaupallisiin tuotteisiin.

Java SE 22 on luokiteltu tavalliseksi tukijulkaisuksi, ja se saa päivityksiä seuraavaan julkaisuun saakka. Long Term Support (LTS) -haaran tulisi olla Java SE 21 tai Java SE 17, jotka saavat päivitykset vuoteen 2031 ja 2029 asti (yleensä saatavilla vuoteen 2028 ja 2026 asti). Java SE 11:n LTS-haaran julkinen tuki päättyi viime syyskuussa, mutta pidennetty tuki jatkuu vuoteen 2032 asti. Java SE 8:n LTS-haaran pidennetty tuki jatkuu vuoteen 2030 asti.

Muistutetaan, että Java 10:n julkaisusta lähtien projekti siirtyi uuteen kehitysprosessiin, mikä merkitsi lyhyempää sykliä uusien julkaisujen muodostukselle. Uusi toiminnallisuus on nyt kehitetty yhteen jatkuvasti päivitettävään päähaaraan, joka sisältää valmiita muutoksia ja josta haarat haarautuvat puolen vuoden välein uusien julkaisujen vakauttamiseksi.

Java 22:n uusia ominaisuuksia ovat:

  • G1-roskankerääjä sisältää tuen aluekiinnitykseen, jonka avulla voit väliaikaisesti korjata Java-objektien sijainnin muistissa, jotta roskakeräin ei siirrä niitä ja jotta viittaukset näihin objekteihin voidaan siirtää turvallisesti Java- ja alkuperäiskoodin välillä. Kiinnityksen avulla voit vähentää viivettä ja välttää roskienkeruun poistamista käytöstä suoritettaessa JNI:n (Java Native Interface) kriittisiä alueita alkuperäisellä koodilla (tätä osiota suoritettaessa JVM ei saa siirtää niihin liittyviä kriittisiä objekteja kilpailuolosuhteiden välttämiseksi). Kiinnitys poistaa kriittiset kohteet roskankeräimen näkyvistä, mikä voi jatkaa kiinnittymättömien alueiden siivoamista.
  • Alustava ominaisuus on lisätty, jotta lausekkeet voidaan määrittää konstruktoreissa ennen super(...) kutsumista. Sitä käytetään eksplisiittisesti kutsumaan emoluokan rakentajaa peritystä luokkakonstruktorista, jos nämä lausekkeet eivät viittaa konstruktorin luomaan ilmentymään. class Ulompi { void hello() { System.out.println("Hei"); } class Sisäinen { Sisäinen() { hei(); super(); } } }
  • FFM (Foreign Function & Memory) API on vakiintunut, mikä mahdollistaa Java-ohjelmien vuorovaikutuksen ulkoisen koodin ja datan kanssa kutsumalla toimintoja ulkoisista kirjastoista ja käyttämällä JVM:n ulkopuolista muistia turvautumatta JNI:ään (Java Native Interface).
  • Tuki nimeämättömille muuttujille ja kuvioiden vastaavuudelle on otettu käyttöön - käyttämättömien mutta välttämättömien muuttujien ja kuvioiden sijaan voit nyt määrittää "_"-merkin. // was String pageName = switch (sivu) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // nyt voit String pageName = switch (sivu) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Class-File API:n alustavaa toteutusta ehdotetaan Java-luokkatiedostojen jäsentämiseen, luomiseen ja muuntamiseen. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); tavu[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanssi MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
  • Java-apuohjelma tarjoaa mahdollisuuden ajaa Java-ohjelmia, jotka toimitetaan useiden kooditiedostojen tai esikäännettyjen luokkakirjastojen muodossa, ilman näiden tiedostojen erikseen kääntämistä ja koontijärjestelmän konfigurointia. Uusi ominaisuus helpottaa sellaisten ohjelmien ajamista, joissa eri luokkien koodit on erotettu erillisiksi tiedostoiksi. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Hei!"); } }

    Esimerkiksi kahdesta tiedostosta "Prog.java" ja "Helper.java" koostuvan ohjelman suorittamiseksi riittää, että ajaa "java Prog.java", joka kääntää Prog-luokan, määrittelee viittauksen Helper-luokkaan, Etsi ja käännä java-tiedosto ja kutsu päämenetelmää.

  • Lisätty toinen alustava String Templates -toteutus, joka toteutettiin merkkijono-literaalien ja tekstilohkojen lisäksi. Merkkijonomallien avulla voit yhdistää tekstiä laskettujen lausekkeiden ja muuttujien kanssa ilman +-operaattoria. Lausekkeiden korvaaminen tapahtuu substituutioilla \{..}, ja substituoitujen arvojen oikeellisuuden tarkistamiseksi voidaan kytkeä erikoiskäsittelijöitä. Esimerkiksi SQL-moottori tarkistaa SQL-koodiin korvattavat arvot ja palauttaa lähtönä java.sql.Statement-objektin, kun taas JSON-prosessori valvoo JSON-korvausten oikeellisuutta ja palauttaa JsonNoden. String query = "VALITSE * FROM Henkilö p WHERE p." + ominaisuus + " = '" + arvo + "'"; // oli Lausekekysely = SQL."""VALITSE * FROM Henkilö p WHERE p.\{ominaisuus} = '\{arvo}'"""; // tuli
  • Vector API:n seitsemäs esikatselu on lisätty, ja se tarjoaa toimintoja vektorilaskelmille, jotka suoritetaan vektoriohjeiden avulla x86_64- ja AArch64-prosessoreissa ja mahdollistavat toimintojen soveltamisen samanaikaisesti useisiin arvoihin (SIMD). Toisin kuin HotSpot JIT -kääntäjän tarjoamat ominaisuudet skalaarioperaatioiden automaattiseen vektorointiin, uusi API mahdollistaa vektorisoinnin eksplisiittisen ohjauksen rinnakkaista tietojenkäsittelyä varten.
  • Laajennetun Stream API:n alustava toteutus on lisätty, joka tukee omien välitoimintojen määrittelyä, mikä voi olla hyödyllistä tapauksissa, joissa olemassa olevat sisäänrakennetut välioperaatiot eivät riitä haluttuun datamuunnokseen. Natiivikäsittelijät yhdistetään uudella välioperaatiolla Stream::gather(Gatherer), joka käsittelee stream-elementtejä soveltamalla niihin käyttäjän määrittämää käsittelijää. 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]]
  • Testattavaksi on ehdotettu toista versiota kokeellisesta API for Structured Concurrency -sovelluksesta, joka yksinkertaistaa monisäikeisten sovellusten kehittämistä käsittelemällä useita eri säikeissä suoritettuja tehtäviä yhtenä lohkona.
  • Lisätty implisiittisesti ilmoitettujen luokkien ja "pää"-metodin nimeämättömien esiintymien toinen alustava toteutus, joka voi luopua julkisista/staattisista ilmoituksista, argumenttijoukon välittämisestä ja muista luokkailmoitukseen liittyvistä yksiköistä. // oli julkinen luokka HelloWorld { public static void main(String[] args) { System.out.println("Hei maailma!"); } } // nyt voit void main() { System.out.println("Hei, maailma!"); }
  • Lisätty Scoped Values ​​-sovelluksen toinen esikatselutoteutus, joka mahdollistaa muuttumattomien tietojen jakamisen säikeiden välillä ja tietojen tehokkaan vaihdon aliketjujen välillä (arvot peritään). Scoped Values ​​-arvoja kehitetään korvaamaan säikeen paikallisten muuttujien mekanismi, ja ne ovat tehokkaampia käytettäessä erittäin suuria määriä virtuaalisia säikeitä (tuhansia tai miljoonia säikeitä). Suurin ero Scope-arvojen ja säikeen paikallisten muuttujien välillä on se, että edelliset kirjoitetaan kerran, niitä ei voi muuttaa tulevaisuudessa ja ne ovat käytettävissä vain säiettä suorituksen ajan.
  • Parallel roskakeräin on parantanut suorituskykyä työskennellessäsi suurten esineiden kanssa. Optimointi mahdollisti joissakin testeissä suurilla objektijoukoilla vähentää viivettä ennen kohteen etsimisen aloittamista 20%.

Lisäksi voit huomata päivityksen julkaisun alustaan ​​sovellusten luomiseen graafisella käyttöliittymällä JavaFX 22.

Lähde: opennet.ru

Lisää kommentti