Nye Java 13-funktioner

1. Oversigt

I september 2019 blev JDK 13 frigivet pr. Java's nye frigivelseskadence på seks måneder. I denne artikel ser vi på de nye funktioner og forbedringer, der er introduceret i denne version.

2. Se udviklerens funktioner

Java 13 har bragt to nye sprogfunktioner ind, omend i preview-tilstanden. Dette indebærer, at disse funktioner er fuldt implementeret for udviklere at evaluere, men ikke er produktionsklare. De kan også fjernes eller gøres permanente i fremtidige udgivelser baseret på feedback.

Vi er nødt til at specificere –Aktiver-forhåndsvisning som et kommandolinjeflag for at bruge preview-funktionerne. Lad os se nærmere på dem.

2.1. Skift udtryk (JEP 354)

Vi så oprindeligt switch-udtryk i JDK 12. Java 13's kontakt udtryk bygger på den tidligere version ved at tilføje en ny udbytte udmelding.

Ved brug af udbytte, kan vi nu effektivt returnere værdier fra et switch-udtryk:

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

Som vi kan se, er det nu let at implementere strategimønsteret ved hjælp af det nye kontakt.

2.2. Tekstblokke (JEP 355)

Den anden forhåndsvisning er tekstblokke til flere linjer Snors som indlejret JSON, XML, HTML osv.

Tidligere, for at integrere JSON i vores kode, ville vi erklære det som en Snor bogstavelig:

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

Lad os nu skrive den samme JSON ved hjælp af Snor tekstblokke:

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

Som det er tydeligt, er der ingen grund til at undslippe dobbelt tilbud eller tilføje en vognretur. Ved at bruge tekstblokke er den indlejrede JSON meget enklere at skrive og lettere at læse og vedligeholde.

Desuden alle Snor funktioner er tilgængelige:

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

Også, java.lang.Streng har nu tre nye metoder til at manipulere tekstblokke:

  • stripIndent () - efterligner kompilatoren for at fjerne tilfældige hvide rum
  • translateEscapes () - oversætter flugtsekvenser som f.eks “\ t” til “\ T”
  • formateret () - fungerer på samme måde som Streng :: format, men til tekstblokke

Lad os se hurtigt på en Streng :: formateret eksempel:

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

Da tekstblokke er en forhåndsvisningfunktion og kan fjernes i en fremtidig udgivelse, markeres disse nye metoder til udfasning.

3. Dynamiske CDS-arkiver (JEP 350)

Klassedelingsdeling (CDS) har været et fremtrædende træk ved Java HotSpot VM i et stykke tid nu. Det tillader klassemetadata, der skal deles på tværs af forskellige JVM'er for at reducere opstartstid og hukommelsesaftryk. JDK 10 udvidede denne evne ved at tilføje applikations-CDS (AppCDS) - for at give udviklere beføjelse til at inkludere applikationsklasser i det delte arkiv. JDK 12 forbedrede denne funktion yderligere til at inkludere CDS-arkiver som standard.

Processen med arkivering af applikationsklasser var imidlertid kedelig. For at generere arkivfiler måtte udviklere foretage prøvekørsler af deres applikationer for først at oprette en klasseliste og derefter dumpe den i et arkiv. Derefter kunne dette arkiv bruges til at dele metadata mellem JVM'er.

Med dynamisk arkivering har JDK 13 forenklet denne proces. Nu vi kan generere et delt arkiv på det tidspunkt, hvor applikationen afsluttes. Dette har fjernet behovet for prøvekørsler.

For at give applikationer mulighed for at oprette et dynamisk delt arkiv oven på standardsystemarkivet, skal vi tilføje en mulighed -XX: ArchiveClassesAtExit og angiv arkivnavnet som argument:

java -XX: ArchiveClassesAtExit = -cp Appnavn

Vi kan derefter bruge det nyoprettede arkiv til at køre den samme app med -XX: SharedArchiveFile mulighed:

java -XX: SharedArchiveFile = -cp Appnavn

4. ZGC: Ubrugt ubrugt hukommelse (JEP 351)

Z Garbage Collector blev introduceret i Java 11 som en mekanisme til indsamling af affald med lav latens, således at GC-pausetider aldrig oversteg 10 ms. I modsætning til andre HotSpot VM GC'er som G1 og Shenandoah var den imidlertid ikke udstyret til at returnere ubrugt bunkehukommelse til operativsystemet. Java 13 tilføjede denne mulighed til ZGC.

Vi får nu et reduceret hukommelsesfodaftryk sammen med forbedring af ydeevnen.

Startende med Java 13, ZGC returnerer nu ikke-hukommelse til operativsystemet som standard, indtil den angivne mindste bunke størrelse er nået. Hvis vi ikke ønsker at bruge denne funktion, kan vi gå tilbage til Java 11-vejen ved at:

  • Brug af option -XX: -ZUcommit, eller
  • Indstilling af lige minimum (-Xms) og maksimum (-Xmx) dyngestørrelser

Derudover har ZGC nu en maksimal understøttet bunkestørrelse på 16 TB. Tidligere var 4TB grænsen.

5. Genimplementere Legacy Socket API (JEP 353)

Vi har set Socket (java.net.Socket og java.net.ServerSocket) API'er som en integreret del af Java siden starten. Imidlertid blev de aldrig moderniseret i de sidste tyve år. Skrevet i arv Java og C var de besværlige og vanskelige at vedligeholde.

Java 13 skubbede denne tendens og erstattede den underliggende implementering for at tilpasse API'en til de futuristiske bruger-mode tråde. I stedet for PlainSocketImpl, peger udbydergrænsefladen nu på NioSocketImpl. Denne nyligt kodede implementering er baseret på den samme interne infrastruktur som java.nio.

Igen har vi en måde at gå tilbage til at bruge PlainSocketImpl. Vi kan starte JVM med systemegenskaben -Djdk.net.usePlainSocketImpl angivet som rigtigt at bruge den ældre implementering. Standard er NioSocketImpl.

6. Diverse ændringer

Bortset fra de JEP'er, der er anført ovenfor, har Java 13 givet os et par bemærkelsesværdige ændringer:

  • java.nio - metode FileSystems.newFileSystem (sti, kort) tilføjet
  • java.tid - nyt officielt japansk æra navn tilføjet
  • javax.crypto - understøttelse af MS Cryptography Next Generation (CNG)
  • javax.security - ejendom jdk.sasl.disabledMekanismer tilføjet for at deaktivere SASL-mekanismer
  • javax.xml.crypto - nyt Snor konstanter introduceret til at repræsentere Canonical XML 1.1 URI'er
  • javax.xml.parsers - nye metoder tilføjet for at instantiere DOM- og SAX-fabrikker med understøttelse af navneområder
  • Unicode support opgraderet til version 12.1
  • Support tilføjet til Kerberos hovednavn kanonisering og henvisninger på tværs af realm

Derudover foreslås et par API'er til fjernelse. Disse inkluderer de tre Snor ovennævnte metoder og javax.security.cert API.

Blandt fjernelser inkluderer rmic værktøj og gamle funktioner fra JavaDoc-værktøjet. Pre-JDK 1.4 SocketImpl implementeringer understøttes heller ikke længere.

7. Konklusion

I denne artikel så vi alle fem JDK Enhancement-forslag implementeret af Java 13. Vi listede også nogle andre bemærkelsesværdige tilføjelser og sletninger.

Som normalt er kildekoden tilgængelig på GitHub.