Nye Java 13-funksjoner

1. Oversikt

I september 2019 ble JDK 13 utgitt, per Java's nye utgivelseskadens på seks måneder. I denne artikkelen ser vi på de nye funksjonene og forbedringene som er introdusert i denne versjonen.

2. Forhåndsvisning av utviklerfunksjoner

Java 13 har fått inn to nye språkfunksjoner, om enn i forhåndsvisningsmodus. Dette innebærer at disse funksjonene er fullt implementert for utviklere å evaluere, men ikke er produksjonsklare. De kan også fjernes eller gjøres permanente i fremtidige utgivelser basert på tilbakemelding.

Vi må spesifisere –Aktivere forhåndsvisning som kommandolinjeflagg for å bruke forhåndsvisningsfunksjonene. La oss se på dem grundig.

2.1. Bryteruttrykk (JEP 354)

Vi så opprinnelig bytteuttrykk i JDK 12. Java 13-tallet bytte om uttrykk bygger på den forrige versjonen ved å legge til en ny utbytte uttalelse.

Ved hjelp av utbytte, kan vi nå effektivt returnere verdier fra et bryteruttrykk:

@Test @SuppressWarnings ("preview") offentlig ugyldig nårSwitchingOnOperationSquareMe_thenWillReturnSquare () {var me = 4; var operasjon = "squareMe"; var result = switch (operation) {case "doubleMe" -> {gir meg * 2; } case "squareMe" -> {gir meg * meg; } standard -> meg; }; assertEquals (16, resultat); }

Som vi kan se, er det nå enkelt å implementere strategimønsteret ved hjelp av det nye bytte om.

2.2. Tekstblokker (JEP 355)

Den andre forhåndsvisningsfunksjonen er tekstblokker for flere linjer Strings som innebygd JSON, XML, HTML, etc.

Tidligere, for å legge JSON inn i koden vår, ville vi erklære det som en String bokstavelig:

String JSON_STRING = "{\ r \ n" + "\" navn \ ": \" Baeldung \ ", \ r \ n" + "\" nettsted \ ": \" // www.% S.com / \ " \ r \ n "+"} ";

La oss nå skrive den samme JSON ved hjelp String tekstblokker:

String TEXT_BLOCK_JSON = "" "{" name ":" Baeldung "," website ":" //www.%s.com/ "}" "";

Som det er tydelig, er det ikke nødvendig å unnslippe dobbelt tilbud eller legge til en vognretur. Ved å bruke tekstblokker er den innebygde JSON mye enklere å skrive og lettere å lese og vedlikeholde.

Dessuten, alle String funksjoner er tilgjengelige:

@Test offentlig ugyldig når TextBlocks_thenStringOperationsWorkSame () {assertThat (TEXT_BLOCK_JSON.contains ("Baeldung")). IsTrue (); assertThat (TEXT_BLOCK_JSON.indexOf ("www")). erGreaterThan (0); assertThat (TEXT_BLOCK_JSON.length ()). isGreaterThan (0); } 

Også, java.lang.Streng har nå tre nye metoder for å manipulere tekstblokker:

  • stripIndent () - etterligner kompilatoren for å fjerne tilfeldig hvit plass
  • translateEscapes () - oversetter rømningssekvenser som “\ t” til “\ T”
  • formatert () - fungerer det samme som Streng :: format, men for tekstblokker

La oss se raskt på en Streng :: formatert eksempel:

assertThat (TEXT_BLOCK_JSON.formatted ("baeldung"). inneholder ("www.baeldung.com")). isTrue (); assertThat (String.format (JSON_STRING, "baeldung"). inneholder ("www.baeldung.com")). isTrue (); 

Siden tekstblokker er en forhåndsvisningfunksjon og kan fjernes i en fremtidig utgivelse, er disse nye metodene merket for avvikling.

3. Dynamisk CDS-arkiv (JEP 350)

Class data sharing (CDS) har vært en fremtredende funksjon i Java HotSpot VM for en stund nå. Det tillater klassemetadata som skal deles på tvers av forskjellige JVM-er for å redusere oppstartstid og minnefotavtrykk. JDK 10 utvidet denne muligheten ved å legge til applikasjons-CDS (AppCDS) - for å gi utviklere muligheten til å inkludere applikasjonsklasser i det delte arkivet. JDK 12 forbedret denne funksjonen ytterligere til å inkludere CDS-arkiver som standard.

Prosessen med arkivering av søknadsklasser var imidlertid kjedelig. For å generere arkivfiler måtte utviklere gjøre prøvekjøringer av applikasjonene sine for å lage en klasseliste først, og deretter dumpe den i et arkiv. Etter det kan dette arkivet brukes til å dele metadata mellom JVM-er.

Med dynamisk arkivering har JDK 13 forenklet denne prosessen. Nå vi kan generere et delt arkiv når applikasjonen avsluttes. Dette har eliminert behovet for prøvekjøringer.

For å la applikasjoner lage et dynamisk delt arkiv på toppen av standard systemarkiv, må vi legge til et alternativ -XX: ArchiveClassesAtExit og spesifiser arkivnavnet som argument:

java -XX: ArchiveClassesAtExit = -cp AppName

Vi kan da bruke det nyopprettede arkivet til å kjøre den samme appen med -XX: Delt arkivfil alternativ:

java -XX: SharedArchiveFile = -cp AppName

4. ZGC: Uncommit Unused Memory (JEP 351)

Z Garbage Collector ble introdusert i Java 11 som en søppelmekanisme med lav latens, slik at GC-pausetider aldri oversteg 10 ms. Imidlertid, i motsetning til andre HotSpot VM-GCer som G1 og Shenandoah, var den ikke utstyrt for å returnere ubrukt heapminne til operativsystemet. Java 13 la denne muligheten til ZGC.

Vi får nå et redusert minnefotavtrykk sammen med ytelsesforbedring.

Fra og med Java 13, ZGC returnerer nå uforpliktet minne til operativsystemet som standard, inntil den angitte minste haugstørrelsen er nådd. Hvis vi ikke vil bruke denne funksjonen, kan vi gå tilbake til Java 11-måten ved å:

  • Bruke alternativet -XX: -ZUforpliktet, eller
  • Sette lik minimum (-Xms) og maksimum (-Xmx) haugestørrelser

I tillegg har ZGC nå en maksimal støttet haugestørrelse på 16 TB. Tidligere var 4TB grensen.

5. Implementere Legacy Socket API (JEP 353)

Vi har sett Socket (java.net. stikkontakt og java.net.ServerSocket) API-er som en integrert del av Java siden starten. Imidlertid ble de aldri modernisert de siste tjue årene. Skrevet i eldre Java og C, var de tungvint og vanskelige å vedlikeholde.

Java 13 tok denne trenden og erstattet den underliggende implementeringen for å justere API-en med de futuristiske trådene for brukermodus. I stedet for PlainSocketImpl, viser leverandørgrensesnittet nå til NioSocketImpl. Denne nylig kodede implementeringen er basert på samme interne infrastruktur som java.nio.

Igjen har vi en måte å gå tilbake til å bruke PlainSocketImpl. Vi kan starte JVM med systemegenskapen -Djdk.net.usePlainSocketImpl angitt som ekte å bruke den eldre implementeringen. Standard er NioSocketImpl.

6. Diverse endringer

Bortsett fra JEP-ene som er oppført ovenfor, har Java 13 gitt oss noen flere bemerkelsesverdige endringer:

  • java.nio - metode FileSystems.newFileSystem (bane, kart) la til
  • java.time - nytt offisielt japansk epokenavn lagt til
  • javax.crypto - støtte for MS Cryptography Next Generation (CNG)
  • javax.security - eiendom jdk.sasl.disabledMechanisms lagt til for å deaktivere SASL-mekanismer
  • javax.xml.crypto - nytt String konstanter introdusert for å representere Canonical XML 1.1 URIer
  • javax.xml.parsers - nye metoder lagt til for å sette i gang DOM- og SAX-fabrikker med støtte for navnerom
  • Unicode-støtte oppgradert til versjon 12.1
  • Støtte lagt til for Kerberos hovednavn kanonisering og henvisninger på tvers av riket

I tillegg foreslås noen få APIer for fjerning. Disse inkluderer de tre String metodene som er oppført ovenfor, og javax.security.cert API.

Blant fjerningene inkluderer rmic verktøy og gamle funksjoner fra JavaDoc-verktøyet. Pre-JDK 1.4 SocketImpl implementeringer støttes heller ikke lenger.

7. Konklusjon

I denne artikkelen så vi alle de fem JDK Enhancement-forslagene implementert av Java 13. Vi listet også opp noen andre bemerkelsesverdige tillegg og slettinger.

Som vanlig er kildekoden tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found