Nove značajke Java 13

1. Pregled

U rujnu 2019. objavljen je JDK 13, prema novom Javinom ritmu izdanja od šest mjeseci. U ovom ćemo članku pogledati nove značajke i poboljšanja uvedena u ovoj verziji.

2. Pregled značajki programera

Java 13 donijela je dvije nove jezične značajke, iako u načinu pregleda. To podrazumijeva da su ove značajke u potpunosti implementirane za procjenu programera, ali nisu spremne za proizvodnju. Također, mogu se ukloniti ili učiniti trajnim u budućim izdanjima na temelju povratnih informacija.

Moramo navesti –Enable-preview kao zastavu naredbenog retka za upotrebu značajki pregleda. Pogledajmo ih dubinski.

2.1. Prebacivanje izraza (JEP 354)

U početku smo vidjeli izraze prekidača u JDK 12. Java 13-ih sklopka izrazi nadovezuju se na prethodnu verziju dodavanjem nove prinos izjava.

Koristeći prinos, sada možemo učinkovito vratiti vrijednosti iz izraza prekidača:

@Test @SuppressWarnings ("preview") javna praznina whenSwitchingOnOperationSquareMe_thenWillReturnSquare () {var me = 4; var operacija = "squareMe"; var rezultat = prekidač (operacija) {case "doubleMe" -> {yield me * 2; } case "squareMe" -> {yield me * me; } zadani -> ja; }; assertEquals (16, rezultat); }

Kao što vidimo, sada je jednostavno implementirati obrazac strategije koristeći novi sklopka.

2.2. Blokovi teksta (JEP 355)

Druga značajka pregleda su tekstualni blokovi za više redaka Nizkao što su ugrađeni JSON, XML, HTML itd.

Ranije bismo ga za ugradnju JSON-a u naš kôd proglasili kao Niz doslovno:

Niz JSON_STRING = "{\ r \ n" + "\" name \ ": \" Baeldung \ ", \ r \ n" + "\" web stranica \ ": \" // www.% S.com / \ " \ r \ n "+"} ";

Sad napišimo isti JSON koristeći Niz blokovi teksta:

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

Kao što je vidljivo, nema potrebe za izbjegavanjem dvostrukih navodnika ili dodavanjem povratka kočije. Korištenjem blokova teksta ugrađeni JSON puno je jednostavniji za pisanje i lakši za čitanje i održavanje.

Štoviše, svi Niz dostupne su funkcije:

@Test javna void whenTextBlocks_thenStringOperationsWorkSame () {assertThat (TEXT_BLOCK_JSON.contains ("Baeldung")). IsTrue (); assertThat (TEXT_BLOCK_JSON.indexOf ("www")). isGreaterThan (0); assertThat (TEXT_BLOCK_JSON.length ()). isGreaterThan (0); } 

Također, java.lang.String sada ima tri nove metode za manipulaciju tekstualnim blokovima:

  • stripIndent () - oponaša kompajler za uklanjanje slučajnih praznina
  • translateEscapes () - prevodi sekvence bijega kao što su "\ t" do "\ T"
  • formatirano () - radi isto kao String :: format, ali za blokove teksta

Pogledajmo na brzinu a Niz :: formatiran primjer:

assertThat (TEXT_BLOCK_JSON.formatted ("baeldung"). contains ("www.baeldung.com")). isTrue (); assertThat (String.format (JSON_STRING, "baeldung"). sadrži ("www.baeldung.com")). isTrue (); 

Budući da su tekstualni blokovi značajka pregleda i mogu se ukloniti u budućem izdanju, ove nove metode označene su za ukidanje.

3. Dinamična arhiva CDS-a (JEP 350)

Dijeljenje podataka klase (CDS) već je neko vrijeme istaknuta značajka Java HotSpot VM. Dopušta metapodaci klase koji se dijele između različitih JVM-ova kako bi se smanjilo vrijeme pokretanja i trag memorije. JDK 10 proširio je ovu mogućnost dodavanjem aplikacijskog CDS-a (AppCDS) - kako bi programerima pružio moć uključivanja klasa aplikacija u zajedničku arhivu. JDK 12 dodatno je poboljšao ovu značajku tako da prema zadanim postavkama uključuje CDS arhive.

Međutim, postupak arhiviranja klasa aplikacija bio je zamoran. Da bi generirali arhivske datoteke, programeri su morali prvo probno pokrenuti svoje aplikacije da bi stvorili popis razreda, a zatim ga izbacili u arhivu. Nakon toga, ova bi se arhiva mogla koristiti za dijeljenje metapodataka između JVM-ova.

Dinamičkim arhiviranjem JDK 13 pojednostavio je ovaj postupak. Sada možemo generirati zajedničku arhivu u trenutku kada aplikacija izlazi. Ovo je eliminiralo potrebu za probnim vožnjama.

Da bismo omogućili aplikacijama stvaranje dinamičke zajedničke arhive povrh zadane sistemske arhive, moramo dodati opciju -XX: ArchiveClassesAtExit i navedite ime arhive kao argument:

java -XX: ArchiveClassesAtExit = -cp AppName

Tada možemo koristiti novostvorenu arhivu za pokretanje iste aplikacije s -XX: SharedArchiveFile opcija:

java -XX: SharedArchiveFile = -cp AppName

4. ZGC: Neupotrebljena neiskorištena memorija (JEP 351)

Zbirnik smeća Z predstavljen je u Javi 11 kao mehanizam sakupljanja smeća s malim kašnjenjem, tako da vremena pauze GC nikad nisu prelazila 10 ms. Međutim, za razliku od ostalih HotSpot VM GC-ova poput G1 i Shenandoah, nije bio opremljen za vraćanje neiskorištene hrpe memorije u operativni sustav. Java 13 dodala je ovu mogućnost ZGC-u.

Sada dobivamo smanjeni otisak memorije zajedno s poboljšanjem performansi.

Počevši od Jave 13, ZGC sada prema zadanim postavkama vraća neograničenu memoriju u operativni sustav, sve dok se ne postigne navedena minimalna veličina hrpe. Ako ne želimo koristiti ovu značajku, možemo se vratiti na Java 11 na način da:

  • Korištenje opcije -XX: -ZOdvoji, ili
  • Postavljanje jednakog minimuma (-Xms) i maksimum (-Xmx) veličine hrpe

Uz to, ZGC sada ima maksimalno podržanu veličinu hrpe od 16TB. Ranije je 4TB bila granica.

5. Reimplementacija Legacy Socket API (JEP 353)

Vidjeli smo Socket (java.net.Utičnica i java.net.ServerSocket) API-ji kao sastavni dio Jave od njenog početka. Međutim, nikada nisu modernizirani u posljednjih dvadeset godina. Napisani u naslijeđenim Java i C, bili su glomazni i teški za održavanje.

Java 13 srušila je ovaj trend i zamijenila temeljnu implementaciju kako bi API poravnala s futurističkim nitima korisničkog načina. Umjesto PlainSocketImpl, sučelje davatelja usluga sada pokazuje na NioSocketImpl. Ova novokodirana provedba temelji se na istoj unutarnjoj infrastrukturi kao i java.nio.

Opet, imamo način da se vratimo korištenju PlainSocketImpl. JVM možemo pokrenuti sa svojstvom sistema -Djdk.net.usePlainSocketImpl postaviti kao pravi da se koristimo starijom implementacijom. Zadana vrijednost je NioSocketImpl.

6. Razne promjene

Osim gore navedenih JEP-ova, Java 13 donio nam je još nekoliko značajnih promjena:

  • java.nio - metoda FileSystems.newFileSystem (put, karta) dodao je
  • java.vrijeme - dodano je novo službeno ime iz japanskog doba
  • javax.crypto - podrška za MS Cryptography Next Generation (CNG)
  • javax.sigurnost - vlasništvo jdk.sasl.disabledMechanisms dodano za onemogućavanje SASL mehanizama
  • javax.xml.crypto - novi Niz konstante predstavljene da predstavljaju Canonical XML 1.1 URI-je
  • javax.xml.parsers - nove metode dodane za instanciranje DOM i SAX tvornica s podrškom za prostore imena
  • Podrška za Unicode nadograđena na verziju 12.1
  • Dodana je podrška za kanonizaciju glavnog imena Kerberos i preporuke za više područja

Uz to, za uklanjanje je predloženo nekoliko API-ja. Tu spadaju tri Niz gore navedene metode i javax.security.cert API.

Među uklanjanja spadaju rmička alat i stare značajke alata JavaDoc. Prije JDK 1.4 SocketImpl implementacije također više nisu podržane.

7. Zaključak

U ovom smo članku vidjeli svih pet prijedloga za poboljšanje JDK koje je implementirala Java 13. Naveli smo i neke druge značajne dodatke i brisanja.

Kao i obično, izvorni kod dostupan je na GitHub-u.