PĂ€rast kuue kuu arendust töötas Oracle vĂ€lja Java SE 22 (Java Platform, Standard Edition 22), mille tĂ”enĂ€oliseks referentideks on avatud projekti OpenJDK. VĂ€ljajĂ€tmisega mĂ”nede vananenud funktsioonide eest on Java SE 22 sĂ€ilitanud tagurpidi ĂŒhilduvuse varasemate Java vĂ€ljaannetega - enamus varasemalt kirjutatud Java projekte töötab muutumatult uue versiooni all. Paigaldamiseks valmis Java SE 22 kogumid (JDK, JRE ja Server JRE) on ette valmistatud Linuxile (x86_64, AArch64), Windowsile (x86_64) ja macOS-ile (x86_64, AArch64). OpenJDK projekti raames vĂ€lja töötatud Java 22 referentversioon on tĂ€ielikult avatud GPLv2 litsentsi alusel koos GNU ClassPath eranditega, mis lubavad dĂŒnaamilist sidumist kaubanduslike toodetega.
Java SE 22 kuulub tavalise toe vĂ€ljaannete kategooriasse, mille jaoks uuendusi antakse vĂ€lja jĂ€rgmise vĂ€ljaandeni. Pikaajalise toe (LTS) haruna tuleks kasutada Java SE 21 vĂ”i Java SE 17, mille uuendusi antakse vĂ€lja vastavalt aastani 2031 ja 2029 (avalikult - kuni 2028 ja 2026). LTS haru Java SE 11 avalik toetus lĂ”ppes eelmisel sĂŒgisel, kuid pikendatud toetus kestab kuni 2032. aastani. LTS haru Java SE 8 pikendatud toetus kestab kuni 2030. aastani.
Tuletame meelde, et alates Java 10 vĂ€ljalaskest on projekt ĂŒle lĂ€inud uuele arendusprotsessile, mis hĂ”lmab lĂŒhema ringiga uute versioonide vĂ€lja andmist. Uus funktsionaalsus areneb nĂŒĂŒd pidevalt uuendatavas master-harus, kuhu lisatakse juba valmis muutused ja millest kuue kuu jooksul hargnevad stabiliseerimise harud uutele vĂ€ljaannetele.
Java 22 uute funktsioonide hulka kuuluvad:
- RĂ€mpsu kogumise G1 korral on rakendatud piirkondade fikseerimise tugi (region pinning), mis vĂ”imaldab ajutiselt fikseerida Java objektide asukohta mĂ€lus, et vĂ€ltida nende liikuvust rĂ€mpsu kogumise ajal ja tagada linkide turvaline edastamine nende objektide vahel Java ja native koodi vahel. Fikseerimine vĂ”imaldab vĂ€hendada latentsust ja vĂ€ltida rĂ€mpsu kogumise vĂ€ljalĂŒlitamist kriitiliste sektsiooni (critical regions) tĂ€itmisel JNI (Java Native Interface) native koodiga (kuna nende sektsioonide tĂ€itmise ajal ei tohi JVM seotud kriitilisi objekte liigutada, et vĂ€ltida rassi olekuid). Fikseerimine toob kriitilised objektid rĂ€mpsu kogumise seadme silmist, mis saab jĂ€tkata fikseerimata piirkondade puhastamist.
- Lisatud on eellepinguline vĂ”imalus, mis vĂ”imaldab konstruktorites loetletud avaldiste mÀÀramist enne super(âŠ) kutset, mida kasutatakse vanema klassi konstruktorist kutse tegemiseks pĂ€rijaklassi konstruktorist, kui need avaldised ei viita konstruktoriga loodud eksemplarile. class Outer { void hello() { System.out.println(âTereâ); } class Inner { Inner() { hello(); super(); } } }
- FFM API (Foreign Function & Memory) on stabiliseeritud, mis vÔimaldab Java programmide koostööd vÀliste koodide ja andmetega, kutse kaudu funktsioonide vÀliste teekide ja mÀlule ligipÀÀsupunktidega, ilma et oleks vaja kasutada JNI-d (Java Native Interface).
- Lisatud on toetus anonĂŒĂŒmsetele muutujatele ja mustrite sobitamisele - ebaoluliste, kuid kutsumise ajal vajalike muutujate ja mustrite asemel saab nĂŒĂŒd mÀÀrata sĂŒmboli â_â. // oli String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> âISSUE #â + issueNumber; ⊠}; // nĂŒĂŒd vĂ”ib String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> âISSUE #â + issueNumber; };
- Pakutakse eellepingulist API Class-File rakendust, et analĂŒĂŒsida, genereerida ja muuta Java klassifailide faile. 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); } } });
- Java utiliidis on rakendatud vĂ”imalus kĂ€ivitada Java programme, mille kood on pakutud mitme faili jaama vĂ”i eelkompileeritud klasside kogudena, ilma et oleks vaja nende failide eraldi kompileerimist ja kogumisseadmiste konfigureerimist. Uus funktsioon lihtsustab programmide kĂ€ivitamist, kus erinevate klasside kood on jaotatud eraldi failidesse. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println(âTere!â); } }
NĂ€iteks, et kĂ€ivitada programmi, mis koosneb kahest failist «Prog.java» ja «Helper.java», on nĂŒĂŒd piisav kĂ€ivitada «java Prog.java», mis toob kaasa klassi Prog kompileerimise, viite klassile Helper leidmise, faili Helper.java leidmise ja kompileerimise ning meetodi main kutsumise.
- Lisatud on teine eelnev rakendus stringimallidest (String Template), mis on rakendatud stringikoonide ja tekstiplokkide tĂ€ienduseks. Stringimallid vĂ”imaldavad kombineerida teksti arvutatud vĂ€ljenditega ja muutujatega ilma «+» operaatorit kasutamata. VĂ€ljendite asendamine toimub asenduste abil \{..}, samas saavad kinnituse kontrollimiseks lisanduda spetsiaalsed kĂ€itlejad. NĂ€iteks SQL kĂ€itleja tagab vÀÀrtuste kontrolli, mis asendatakse SQL-koodis, ja tagastab objekti java.sql.Statement, samas kui JSON kĂ€itleja jĂ€lgib JSON-i asenduste Ă”igsust ja tagastab JsonNode. String query = «SELECT * FROM Person p WHERE p.» + property + » = â» + value + «â»; // oli Statement query = SQL.»»»SELECT * FROM Person p WHERE p.\{property} = â\{value}'»»»; // on
- Lisatud on seitsmes eelnev rakendus API Vector, mis pakub vektorkalkulatsiooni funktsioone, mis toimivad x86_64 ja AArch64 protsessorite vektorinstruktsioonide abil ning vÔimaldavad korraga rakendada toiminguid mitme vÀÀrtuse suhtes (SIMD). Erinevalt JIT-kompilaatori HotSpot pakutavatest automaatvektoriseerimise vÔimalustest skalaarses operaatoris, annab uus API vÔimaluse selgelt hallata vektorisatsiooni andmete paralleelseks töötlemiseks.
- Lisatud on eelnev rakendus laiendatud API Stream, mis toetab oma vahepealsete toimingute mÀÀratlemist, mis vĂ”ivad osutuda kasulikuks juhtudel, kui olemasolevad sisseehitatud vahepealsed toimingud ei ole piisavad soovitud andmete transformatsiooniks. Oma kĂ€itlejad ĂŒhendatakse uue vahepealse toimingu Stream::gather(Gatherer) abil, mis töötleb voogude elemente, rakendades neile mÀÀratud kasutaja kĂ€itlejat. 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]]
- Testimiseks on vĂ€lja pakutud teine versioon eksperimentaalset API-d struktureeritud paralleelsuse (Structured Concurrency) jaoks, mis lihtsustab mitme ĂŒlesande töötlemist erinevates lĂ”imedes kui ĂŒhtset plokki, muutes mitme lĂ”imeta rakenduste arendamise lihtsamaks.
- Lisatud on teine eelnev rakendus kaudsete klasside ja anonĂŒĂŒmsete main meetodite, kus ei pea olema avaldatud/public static, argumentide massi ja teiste klassi mÀÀramisega seotud elementidega. // oli public class HelloWorld { public static void main(String[] args) { System.out.println(«Hello world!»); } } // nĂŒĂŒd on vĂ”imalik void main() { System.out.println(«Hello, World!»); }
- Lisatud on teine eelnev rakendus piiratud vÀÀrtuste (Scoped Values) jaoks, mis vÔimaldavad koostööd kasutatavate muutumatute andmete osas lÔimedes ja tÔhusat andmevahetust alamsisese lÔimede vahel (vÀÀrtused pÀrandatakse). Piiratud vÀÀrtused arenevad vÀlja, et asendada lÔime kohalikke muutujaid (thread-local variables) ja on tÔhusamad, kui kasutatakse vÀga suurt arvu virtuaalseid lÔime (tuhandeid ja miljoneid lÔime). Peamine erinevus piiratud vÀÀrtuste ja lÔime kohalike muutuja vahel on see, et esimesed kirjutatakse korra, neid ei saa edaspidi muuta ning nad on kÀttesaadavad ainult lÔime tÀitmise ajal.
- JÀÀtme kogumiseks on Parallel tÔstnud suurte objektimassidega töötamise efektiivsust. Optimeerimine on vÔimaldanud teatud testides, kus on suured objektimassid, vÀhendada viivitust enne objekti otsimise alustamist kuni 20%.
TÀiendavalt vÔib mÀrkida JavaFX 22 graafilise kasutajaliidese rakenduste arendamise platvormi vÀrskenduse avaldamist.
Allikas: opennet.ru
