Efter sex mĂ„nader av utveckling har Oracle slĂ€ppt plattformen Java SE 17 (Java Platform, Standard Edition 17), dĂ€r den referensimplementation som anvĂ€nds bygger pĂ„ det öppna projektet OpenJDK. Bortsett frĂ„n att vissa förĂ„ldrade funktioner har tagits bort, har Java SE 17 bibehĂ„llen bakĂ„tkompatibilitet med tidigare versioner av Java-plattformen â de flesta tidigare skrivna Java-projekt kommer att fungera utan Ă€ndringar nĂ€r de körs pĂ„ den nya versionen. InstallationsfĂ€rdiga versioner av Java SE 17 (JDK, JRE och Server JRE) har förberetts för Linux (x86_64, AArch64), Windows (x86_64) och macOS (x86_64, AArch64). Den referensimplementation av Java 17 som utvecklats inom ramen för OpenJDK-projektet Ă€r helt öppen under GPLv2-licensen med undantag för GNU ClassPath, som tillĂ„ter dynamisk lĂ€nkning med kommersiella produkter.
Java SE 17 klassas som en version med lÄngsiktig support (LTS), dÀr uppdateringar kommer att slÀppas fram till 2029. Utgivningen av uppdateringar för den föregÄende versionen Java 16 har upphört. Den tidigare LTS-grenen Java 11 kommer att stödjas fram till 2026. Den nÀsta LTS-versionen planeras till september 2024. Vi pÄminner om att projektet frÄn och med Java 10 har övergÄtt till en ny utvecklingsprocess som innebÀr en kortare cykel för nya versioner. Den nya funktionaliteten utvecklas nu i en stÀndigt uppdaterad mastergren, dÀr fÀrdiga Àndringar inkluderas, och var sjÀtte mÄnad avgrenas grenar för stabilisering av de nya versionerna.
Bland nyheterna i Java 17 kan nÀmnas:
- En experimentell implementering av mönstermatchning i "switch"-uttryck har föreslagits, vilket möjliggör anvĂ€ndning av flexibla mönster i "case"-etiketterna som tĂ€cker en serie vĂ€rden, vilka tidigare krĂ€vde anvĂ€ndning av omfattande kedjor av "ifâŠelse"-uttryck. Dessutom har möjligheten att hantera NULL-vĂ€rden inuti "switch" sĂ€kerstĂ€llts. 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(); };
- Stödet för inkapslade ("sealed") klasser och grĂ€nssnitt har stabiliserats, vilka inte kan anvĂ€ndas av andra klasser och grĂ€nssnitt för arv, utvidgning eller överskrivning av implementation. Inkapslade klasser ger ocksĂ„ ett mer deklarativt sĂ€tt att begrĂ€nsa anvĂ€ndningen av superklassen Ă€n Ă„tkomstmodifierare, baserat pĂ„ en explicit upprĂ€kning av underklasser som Ă€r tillĂ„tna för utvidgning. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
- En andra preliminÀr implementering av API:et för Vektorer har föreslagits, vilket tillhandahÄller funktioner för vektorberÀkningar som utförs med hjÀlp av vektorinstruktioner frÄn x86_64- och AArch64-processorer och möjliggör att operationer tillÀmpas samtidigt pÄ flera vÀrden (SIMD). Till skillnad frÄn omfattningen av av-vÀrde-vÀrdesvigning av skalaroperationer som erbjuds i JIT-kompilatorn HotSpot, ger det nya API:et möjlighet att explicit styra vektoriseringen för parallell databehandling.
- En preliminÀr implementering av API:et för UtlÀndsk Funktion & Minne har lagts till, som gör det möjligt för applikationer att interagera med kod och data utanför Java-runtime. Det nya API:et tillÄter effektiv anrop av funktioner som inte körs i JVM och att fÄ Ätkomst till minne som inte hanteras av JVM. Till exempel kan funktioner frÄn externa delade bibliotek anropas och data i processen nÄs utan att anvÀnda JNI.
- Ritmotor för macOS, som stöder Java 2D API, som i sin tur anvÀnds i Swing API, har anpassats för att anvÀnda grafik-API:et Metal. Som standard anvÀnds fortfarande OpenGL pÄ macOS-plattformen, och för att aktivera stöd för Metal krÀvs det att parametern "-Dsun.java2d.metal=true" stÀlls in och att minst macOS-version 10.14.x Àr installerad.
- En port för macOS/AArch64-plattformen (Apple-datorer med de nya Apple M1-chippen) har lagts till. En sÀrskild funktion hos porten Àr stöd för minnesskyddsmekanismen W^X (Write XOR Execute), dÀr minnessidor inte kan vara samtidigt tillgÀngliga för skrivning och exekvering. (kod kan endast exekveras efter att skrivning har förhindrats, och skrivning till en minnessida Àr endast möjlig efter att exekvering har förhindrats).
- Endast strikt (strictfp) semantik för flyttalsuttryck har Äterinförts. Stödet för tillgÀngligheten har upphört frÄn och med Java 1.2-versionen av semantiken "default", som inkluderade förenklingar för att fungera pÄ mycket gamla matematiska co-processorer som x87 (efter introduktionen av SSE2-instruktioner har behovet av ytterligare semantik försvunnit).
- Nya typer av grÀnssnitt till pseudotillfÀlliga nummergeneratorer har införlivats, liksom ytterligare algoritmer för bÀttre kvalitet pÄ de genererade slumptalen. Applikationerna har möjlighet att vÀlja algoritm för pseudotillfÀlliga nummergeneratorer. Stödet för att generera strömmar av slumpmÀssiga objekt har förbÀttrats.
- Obligatorisk strikt inkapsling av alla interna element i JDK har införts, med undantag för kritiska API:er, som sun.misc.Unsafe. Strikt inkapsling blockerar försök att fĂ„ Ă„tkomst till interna klasser, metoder och fĂ€lt frĂ„n koden. Tidigare kunde strikt inkapsling inaktiveras med alternativet "âillegal-access=permit", men det har nu blivit förĂ„ldrat. För applikationer som behöver Ă„tkomst till interna klasser, metoder och fĂ€lt bör dessa explicit definieras med alternativet "âadd-opens" eller med attributet Add-Opens i manifestfilen.
- Applikationerna har möjlighet att definiera filter för deserialisering av data, vilket kan bero pÄ kontext och vÀljas dynamiskt i samband med specifika deserialiseringsoperationer. Definierade filter tillÀmpas pÄ hela en virtuell maskin (JVM-omfattande), det vill sÀga omfattar inte bara sjÀlva applikationen utan Àven de tredjepartsbibliotek som anvÀnds i applikationen.
- I Swing har metoden javax.swing.filechooser.FileSystemView.getSystemIcon lagts till för att ladda stora ikoner, vilket förbÀttrar grÀnssnittsbildningen pÄ skÀrmar med hög pixeldensitet (HighDPI).
- I api:t java.net.DatagramSocket har stöd för att ansluta till Multicast-grupper införts utan att behöva anvÀnda det separata api:t java.net.MulticastSocket.
- Verktyget IGV (Ideal Graph Visualizer) har förbÀttrats för att sÀkerstÀlla interaktiv visualisering av den mellanliggande koden i JIT-kompilatorn HotSpot VM C2.
- I JavaDoc, pÄ samma sÀtt som kompilatorn javac, anges radnumret för problemlinjen i kÀllfilen och platsen för felet nÀr ett felrapporteras.
- Egenskapen native.encoding har lagts till, vilket Äterspeglar namnet pÄ den systemkodning av tecken som anvÀnds (UTF-8, koi8-r, cp1251 osv.).
- GrÀnssnittet java.time.InstantSource har lagts till, vilket möjliggör manipulering av tid utan koppling till tidszon.
- API:t java.util.HexFormat har lagts till för att konvertera till hexadecimalt format och vice versa.
- Kompilatorn har fÄtt en blackhole-lÀge som inaktiverar undantagsoperationer för oanvÀnd kod (dead-code elimination), vilket kan anvÀndas vid prestandatestning.
- I Runtime har alternativet "-Xlog:async" lagts till för att skriva loggar i asynkront lÀge.
- Vid installation av sÀkrade anslutningar anvÀnds TLS 1.3 som standard (tidigare anvÀndes TLS 1.2).
- Applet-API:n (java.applet.Applet*, javax.swing.JApplet) som tidigare annonserats som förÄldrad har flyttats till kategorin för planerad avveckling och anvÀndes för att köra Java-applikationer i webblÀsaren (har blivit irrelevant efter att Java-plugin-stödet för webblÀsare upphörde).
- Security Manager har flyttats till kategorin för planerad avveckling, som lÀnge har blivit irrelevant och inte efterfrÄgad efter att stödet för webblÀsarpluginet har upphört.
- RMI Activation-mekanismen har tagits bort, vilket var förÄldrat, flyttades till graden av val i Java 8 och anvÀnds nÀstan inte i modern praxis.
- Den experimentella kompilatorn som stödde JIT (just-in-time) för dynamisk kompilering av Java-kod för HotSpot JVM har tagits bort frÄn SDK, liksom AOT-lÀget (ahead-of-time) för kompilation av klasser till maskinkod före körning av den virtuella maskinen. Kompilatorn skrevs i Java och baserades pÄ arbete frÄn Graal-projektet. Det pÄpekas att underhÄllet av kompilatorn krÀver stor arbetsinsats utan att vara rÀttfÀrdigat av utvecklarnas efterfrÄgan.
KĂ€lla: opennet.ru
