PĂ€rast kuue kuu arendust on Oracle vĂ€lja andnud Java SE 17 platvormi (Java Platform, Standard Edition 17), mille etalonversioonina kasutatakse avatud projekti OpenJDK. VĂ€lja arvatud mĂ”ned vananenud vĂ”imalused, sĂ€ilitab Java SE 17 tagasiĂŒhilduvuse varasemate Java vĂ€ljaannetega - enamik varem loodud Java projekte töötab uue versiooni all muutusteta. Paigaldamiseks valmis Java SE 17 kogumid (JDK, JRE ja Server JRE) on saadaval Linuxile (x86_64, AArch64), Windowsile (x86_64) ja macOS-ile (x86_64, AArch64). OpenJDK projekti raames vĂ€lja töötatud Java 17 etalonversioon on tĂ€ielikult avatud GPLv2 litsentsi alusel, mis sisaldab GNU ClassPath'i erandeid, mis lubavad dĂŒnaamilist sidumist kaubanduslike toodetega.
Java SE 17 on klassifitseeritud pikaajalise toe (LTS) vĂ€ljaandena, mille vĂ€rskendused ilmuvad kuni aastani 2029. Eelmise vahepealse vĂ€ljaande Java 16 vĂ€rskenduste vĂ€ljaandmine on lĂ”petatud. Eelmise LTS haru Java 11 toetamine kestab kuni 2026. aastani. JĂ€rgmine LTS vĂ€ljaanne on kavandatud septembriks 2024. Peame meeles, et alates Java 10 vĂ€ljaandest on projekt ĂŒleminekut uuele arendusprotsessile, mis hĂ”lmab lĂŒhemaid uute vĂ€ljaannete tsĂŒkleid. Uued funktsionaalsused arenevad nĂŒĂŒd ĂŒhes pidevalt uuendatavas master-harus, kuhu lisatakse juba valmis muudatused ja millest harunevad iga kuue kuu tagant uute vĂ€ljaannete stabiilsuse tagamiseks harud.
Java 17 uuenduste seas on mÀrkimisvÀÀrseid uuendusi:
- Pakutakse eksperimenteerimisversiooniga mustri sobitamist "switch" vÀljendites, mis vÔimaldab "case" tunnustes kasutada mitte tÀpseid vÀÀrtusi, vaid paindlikke mustreid, mis katab kohe terve hulga vÀÀrtusi, mille jaoks tuli varem kasutada mahukaid "if...else" vÀljendeid. Lisaks on "switch" sees tagatud NULL vÀÀrtuste töötlemise vÔimalused. Object o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
- On stabiliseeritud suletud («sealed») klasside ja liideste toetus, mis ei saa olla teiste klasside ja liideste pĂ€rimiseks, laiendamiseks vĂ”i rakenduse ĂŒlekirjutamiseks kasutatud. Suletud klassid pakuvad ka deklaratiivsemat viisi superklasside kasutamise piiramise mÀÀratlemiseks kui ligipÀÀsumaandi, mis pĂ”hineb alamklasside selgesĂ”nalisel loetlemisel, mida on lubatud laiendada. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
- Pakutud on teine eelrealiseerimine API Vector, mis pakub funktsioone vektorite arvutamiseks, mida teostatakse x86_64 ja AArch64 protsessorite vektorite juhiste abil ning mis vĂ”imaldavad korraga rakendada operatsioone mitmele vÀÀrtusele (SIMD). Erinevalt HotSpot JIT-kompilaatori pakutud skalaarsĂŒsteemide automaatvektoriseerimise vĂ”imalustest, annab uus API vĂ”imaluse eksplicitse vektorisatsiooni juhtimiseks andmete paralleelseks töötlemiseks.
- Lisatud on eelrealiseerimine API Foreign Function & Memory, mille abil saavad rakendused suhelda Java runtime'ist vÀljaspool olevate koodide ja andmetega. Uus API vÔimaldab tÔhusalt vÀliseid funktsioone, mis ei tööta JVM-is, kutsuda ja mÀlule, mida JVM ei kontrolli, ligi pÀÀseda. NÀiteks on vÔimalik kutsuda funktsioone vÀlistest jagatud teekidest ja pÀÀseda protsessi andmetele ligi ilma JNI kasutamata.
- MacOS-i renderdamise mootor, mis toetab Java 2D API tööd, mis omakorda on integreeritud Swing API-sse, on kohandatud metallilise graafika API kasutamiseks. MacOS-i platvormil jÀtkatakse OpenGL-i kasutamist vaikimisi, kuid Metal toe aktiveerimiseks on vajalik seadistada parameeter "-Dsun.java2d.metal=true" ja omada vÀhemalt macOS-i versiooni 10.14.x.
- Lisatud on port macOS/AArch64 platvormile (Macintoshid, mis pÔhinevad uutel Apple M1 kiipidel). Porta eripÀra on W^X (Write XOR Execute) mÀlu kaitse mehhanismi tugi, mille korral ei saa mÀlule korraga ligi pÀÀseda kirjutamiseks ja tÀitmiseks. (koodi saab tÀita ainult siis, kui kirjutamine on keelatud, ja kirjutamine mÀllu on vÔimalik ainult pÀrast tÀitmise keelamist).
- Tagasi on toodud ainult rangelt (strictfp) ujuvapunktide semantika. Toetamine, mis algas Java 1.2 vÀljaandega, on lÔpetatud, sealhulgas 'default' semantika, mis hÔlmas lihtsustusi vÀga vanade x87 matemaatikaprotsessoritega töötamiseks (SSE2 juhiste tulek on hulpinud vajaduse tÀiendava semantika jÀrele).
- Uued pseudojuhuslike arvude generaatorite liideste tĂŒĂŒbid on rakendatud ning tĂ€iendavad algoritmid pakkusid kvaliteetsemat juhuslike arvude genereerimist. Rakendused said vĂ”imaluse valida pseudojuhuslike arvude genereerimise algoritmi. Juhuslike objektide voogude genereerimise toetust on parendatud.
- KĂ”ikide JDK siseelementide range kapseldamine on rakendatud, vĂ€lja arvatud kriitilised API-d, nagu sun.misc.Unsafe. Ranget kapseldamist blokeerib katsed ligipÀÀsuks siseklassidele, meetoditele ja vĂ€ljadele. Varem vĂ”is ranget kapseldamist vĂ€lja lĂŒlitada valiku 'âillegal-access=permit' abil, kuid see on nĂŒĂŒd muutunud aegunud. Rakendustele, mis vajavad ligipÀÀsu siseklassidele, meetoditele ja vĂ€ljadele, tuleb need selgelt mÀÀratleda, kasutades valikut 'âadd-opens' vĂ”i Add-Opens atribuuti manifeerifailis.
- Rakendustele on antud vĂ”imalus mÀÀrata andmete deserialiseerimise filtreid, mis vĂ”ivad sĂ”ltuda kontekstist ja mille valik on dĂŒnaamiline konkreetsete deserialiseerimise operatsioonide kontekstis. Kehtestatud filtrid kehtivad kogu virtuaalses masinas (JVM laialdaselt), st nad katab mitte ainult rakenduse, vaid ka rakenduses kasutatavad vĂ€lised teegid.
- Swingi on lisatud meetod javax.swing.filechooser.FileSystemView.getSystemIcon suurte ikoonide laadimise jaoks, mis vÔimaldab parandada liidese loomist kÔrge pikseldihedusega ekraanidel (HighDPI).
- API-s java.net.DatagramSocket on rakendatud Multicast-rĂŒhmadele ĂŒhenduse loomise toetust ilma eraldi API java.net.MulticastSocket kasutamise vajaduseta.
- IGV (Ideal Graph Visualizer) tööriista on tÀiustatud, pakkudes interaktiivset visuaalset esitlust koodi vahevormist JIT-koodikogujas HotSpot VM C2.
- JavaDoc-is, sarnaselt javac-iga, nĂ€idatakse nĂŒĂŒd veateate genereerimisel probleemse rea numbrit lĂ€htefailis ja vea asukohta.
- Lisatud on native.encoding omadus, mis peegeldab sĂŒsteemi mĂ€rkide kodeeringu nime (UTF-8, koi8-r, cp1251 jne).
- Lisatud on java.time.InstantSource liides, mis vÔimaldab ajaga manipuleerida ilma ajavööndiga seotust.
- Lisatud on java.util.HexFormat API, et konverteerida kuuekĂŒmnendsĂŒsteemi esitusse ja tagasi.
- Komplilaatorisse on lisatud blackhole reĆŸiim, mis keelab kasutamata koodi (dead-code elimination) erandite operatsioonid, mida saab kasutada jĂ”udlustestide lĂ€biviimisel.
- Runtime'i on lisatud valik â-Xlog:asyncâ, et logida logisid asĂŒnkroonses reĆŸiimis.
- Kaitstud ĂŒhenduste seadistamisel on vaikimisi aktiveeritud TLS 1.3 (varem kasutati TLS 1.2).
- Vanast API Applet (java.applet.Applet*, javax.swing.JApplet), mida kasutati Java rakenduste kÀitamiseks brauseris, on tÔlgitud kavandatuks eemaldamiseks (kaotas asjakohasuse brauserite jaoks Java plugina toe lÔpetamisega).
- Kaitsehaldur on tÔlgitud kavandatuks eemaldamiseks, kuna see on ammu kaotanud asjakohasuse ja ei olnud nÔudlik pÀrast brauseri plugina toe lÔpetamist.
- RMI Activation mehhanism, mis on vananenud, eemaldatud ja oli alustatud juba Java 8-s, ei ole tÀnapÀeva praktikas enam palju kasutusel.
- SDK-st on eemaldatud eksperimentaalne kompilaator, mis toetab JIT (just-in-time) Java koodi dĂŒnaamilist kompileerimist HotSpot JVM-i jaoks, samuti AOT (ahead-of-time) klasside kompileerimist masina koodi enne virtuaalse masina kĂ€ivitamist. Kompilaator kirjutati Java-s ja pĂ”hines Graali projekti arendustel. MĂ€rgitakse, et kompilaatori hooldamine nĂ”uab suurt tööjĂ”ukulusid, mis ei Ă”igusta end arvestades arendajate nĂ”udluse puudumist.
Allikas: opennet.ru
