Ciri Java 13 Baru

1. Gambaran keseluruhan

September 2019 menyaksikan pelepasan JDK 13, setiap irama rilis baru Java selama enam bulan . Dalam artikel ini, kita akan melihat ciri dan penambahbaikan baru yang diperkenalkan dalam versi ini.

2. Pratonton Ciri Pembangun

Java 13 telah membawa dua ciri bahasa baru, walaupun dalam mod pratonton . Ini menunjukkan bahawa ciri-ciri ini dilaksanakan sepenuhnya untuk dinilai oleh pembangun, namun belum siap untuk pengeluaran. Juga, mereka boleh dikeluarkan atau dibuat kekal dalam siaran masa depan berdasarkan maklum balas.

Kita perlu menentukan –sable-preview sebagai bendera baris perintah untuk menggunakan ciri pratonton . Mari kita perhatikan secara mendalam.

2.1. Tukar Ekspresi (JEP 354)

Kami pada mulanya saw ungkapan suis dalam JDK 12. Java 13. menukar ungkapan bina pada versi sebelumnya dengan menambah yang baru hasil kenyataan.

Dengan menggunakan hasil , kini kita dapat mengembalikan nilai dari ungkapan suis dengan berkesan :

@Test @SuppressWarnings("preview") public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() { var me = 4; var operation = "squareMe"; var result = switch (operation) { case "doubleMe" -> { yield me * 2; } case "squareMe" -> { yield me * me; } default -> me; }; assertEquals(16, result); }

Seperti yang dapat kita lihat, kini mudah untuk menerapkan pola strategi menggunakan peralihan baru .

2.2. Blok Teks (JEP 355)

Ciri pratonton kedua adalah blok teks untuk String berbaris seperti JSON, XML, HTML, dll.

Sebelumnya, untuk memasukkan JSON dalam kod kami, kami akan menyatakannya sebagai String literal:

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

Sekarang mari tulis JSON yang sama menggunakan blok teks String :

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

Seperti yang terbukti, tidak perlu melarikan diri dari tanda kutip ganda atau untuk menambah perjalanan pulang. Dengan menggunakan blok teks, JSON tertanam jauh lebih mudah untuk ditulis dan lebih mudah dibaca dan dikekalkan.

Selain itu, semua fungsi String ada:

@Test public 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); } 

Juga, java.lang.String kini mempunyai tiga kaedah baru untuk memanipulasi blok teks:

  • stripIndent () - meniru penyusun untuk membuang ruang putih yang tidak disengajakan
  • translateEscapes () - menterjemahkan urutan pelarian seperti "\\ t" ke "\ t"
  • diformat () - berfungsi sama seperti String :: format, tetapi untuk blok teks

Mari lihat sekilas contoh String :: berformat :

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

Oleh kerana blok teks adalah ciri pratonton dan dapat dikeluarkan dalam rilis yang akan datang, kaedah baru ini ditandai untuk tidak digunakan lagi.

3. Arkib CDS Dinamik (JEP 350)

Perkongsian data kelas (CDS) telah menjadi ciri utama Java HotSpot VM untuk sementara waktu sekarang. Ia membolehkan metadata kelas dikongsi di pelbagai JVM untuk mengurangkan masa permulaan dan jejak memori . JDK 10 memperluas kemampuan ini dengan menambahkan CDS aplikasi (AppCDS) - untuk memberi kuasa kepada pembangun untuk memasukkan kelas aplikasi dalam arkib bersama. JDK 12 meningkatkan lagi ciri ini untuk memasukkan arkib CDS secara lalai.

Namun, proses mengarkibkan kelas aplikasi membosankan. Untuk menghasilkan fail arkib, pembangun harus melakukan percubaan aplikasi mereka untuk membuat senarai kelas terlebih dahulu, dan kemudian membuangnya ke arkib. Selepas itu, arkib ini dapat digunakan untuk berkongsi metadata antara JVM.

Dengan pengarkiban dinamik, JDK 13 telah mempermudah proses ini. Sekarang kita dapat menghasilkan arkib bersama semasa aplikasi keluar . Ini telah menghilangkan keperluan untuk percubaan dijalankan.

Untuk membolehkan aplikasi membuat arkib bersama dinamik di atas arkib sistem lalai, kita perlu menambahkan pilihan -XX: ArchiveClassesAtExit dan menentukan nama arkib sebagai argumen:

java -XX:ArchiveClassesAtExit= -cp  AppName

Kita kemudian boleh menggunakan arkib yang baru dibuat untuk menjalankan aplikasi yang sama dengan pilihan -XX: SharedArchiveFile :

java -XX:SharedArchiveFile= -cp  AppName

4. ZGC: Memadam Memori Tidak Digunakan (JEP 351)

Z Garbage Collector diperkenalkan di Java 11 sebagai mekanisme pengumpulan sampah latensi rendah, sehingga waktu berhenti GC tidak pernah melebihi 10 ms. Walau bagaimanapun, tidak seperti HotCpot VM GC lain seperti G1 dan Shenandoah, ia tidak dilengkapi untuk mengembalikan memori timbunan yang tidak digunakan ke sistem operasi. Java 13 menambahkan keupayaan ini ke ZGC.

Kami kini mendapat jejak memori yang berkurang bersama dengan peningkatan prestasi.

Bermula dengan Java 13, ZGC kini mengembalikan memori tanpa kompres ke sistem operasi secara lalai , hingga ukuran timbunan minimum yang ditentukan tercapai. Sekiranya kita tidak mahu menggunakan ciri ini, kita dapat kembali ke Java 11 dengan:

  • Menggunakan pilihan -XX: -ZUncommit, atau
  • Menetapkan ukuran timbunan minimum ( -Xms ) dan maksimum ( -Xmx ) yang sama

Selain itu, ZGC kini mempunyai saiz timbunan maksimum 16TB. Sebelumnya, 4TB adalah hadnya.

5. Sempurnakan semula Legacy Socket API (JEP 353)

Kami telah melihat API Socket ( java.net.Socket dan java.net.ServerSocket ) sebagai bahagian integral dari Java sejak awal. Namun, mereka tidak pernah dimodenkan dalam dua puluh tahun terakhir. Ditulis dalam bahasa Jawa dan C yang lama, mereka rumit dan sukar dikekalkan.

Java 13 bucked this trend and replaced the underlying implementation to align the API with the futuristic user-mode threads. Instead of PlainSocketImpl, the provider interface now points to NioSocketImpl. This newly coded implementation is based on the same internal infrastructure as java.nio.

Again, we do have a way to go back to using PlainSocketImpl. We can start the JVM with the system property -Djdk.net.usePlainSocketImpl set as true to use the older implementation. The default is NioSocketImpl.

6. Miscellaneous Changes

Apart from the JEPs listed above, Java 13 has given us a few more notable changes:

  • java.nio – method FileSystems.newFileSystem(Path, Map) added
  • java.time – new official Japanese era name added
  • javax.crypto – support for MS Cryptography Next Generation (CNG)
  • javax.security – property jdk.sasl.disabledMechanisms added to disable SASL mechanisms
  • javax.xml.crypto – new String constants introduced to represent Canonical XML 1.1 URIs
  • javax.xml.parsers – new methods added to instantiate DOM and SAX factories with namespaces support
  • Unicode support upgraded to version 12.1
  • Support added for Kerberos principal name canonicalization and cross-realm referrals

Selain itu, beberapa API dicadangkan untuk dikeluarkan. Ini termasuk tiga kaedah String yang disenaraikan di atas, dan API javax.security.cert .

Antara penyingkiran termasuk alat rmic dan ciri lama dari alat JavaDoc. Pelaksanaan Pra-JDK 1.4 SocketImpl juga tidak lagi disokong.

7. Kesimpulannya

Dalam artikel ini, kami melihat kelima-lima Proposal Peningkatan JDK dilaksanakan oleh Java 13. Kami juga menyenaraikan beberapa penambahan dan penghapusan penting lainnya.

Seperti biasa, kod sumber tersedia di GitHub.