JavaRush /Blog Java /Random-MS /Java 13: Ciri Baharu

Java 13: Ciri Baharu

Diterbitkan dalam kumpulan
Kami sudah terbiasa dengan fakta bahawa keluaran JDK baharu muncul setiap enam bulan. Setakat ini, pendekatan ini telah membenarkan dirinya sendiri, dan kebimbangan sesetengah pembangun bahawa mereka tidak akan mengikuti kemas kini telah menjadi sia-sia: terdapat beberapa perubahan selama enam bulan dan ia tidak global seperti sebelum ini. Nah, pengaturcara baru mungkin tidak menyedari inovasi itu sama sekali. Java 13: ciri baharu - 1Walau bagaimanapun, adalah lebih baik untuk pembangun perisian masa depan untuk mengikuti perkembangan inovasi. Dalam artikel ini, kami secara tradisinya akan menerangkan cadangan lanjutan yang diterima (JEP). Java 13 merangkumi hanya lima JEP dan 76 elemen perpustakaan teras baharu (yang hampir separuh daripadanya adalah tambahan ringkas kepada pakej java.io).

JEP 355 : Blok Teks(Pratonton)

Mari kita mulakan dengan menukar sintaks bahasa. Yang paling penting ialah blok teks. Ia membolehkan anda mengelak daripada melarikan diri daripada aksara dan mengetahui cara memformat rentetan. Anda mungkin ingat bahawa JDK 12 tidak menyertakan ciri Raw String Literals (JEP 326) yang dijangkakan untuk bekerja dengan literal string. Di Java 13, ia digantikan oleh JEP 355 dengan blok teksnya. Anda mungkin ingat bahawa di Jawa, rentetan dibalut dengan petikan berganda. Ini bagus, tetapi masalahnya ialah baris tidak boleh menduduki lebih daripada satu baris fail sumber (untuk mengelakkan kekeliruan dengan baris Java, di sini kami akan memanggil baris fail sebagai "garisan"). Baiklah, mari kita lihat dan gunakan, sebagai contoh, simbol \njika rehat diperlukan, atau gabungan ungkapan berbilang baris. Ia tidak menjadi sangat baik! Literal teks dengan serpihan HTML, XML, SQL atau JSON yang dibenamkan amat menyusahkan. Semua pelarian, penggabungan dan penyuntingan manual ini menjadikan kod menyusahkan untuk ditulis dan sukar dibaca. Blok teks cuba menyelesaikan masalah ini. Mereka bermula uh... dengan petikan berganda ganda dan berakhir dengan mereka (saya tahu, bunyinya tidak begitu bagus). Segala-galanya di antara petikan ditafsirkan sebagai sebahagian daripada baris, termasuk baris baharu. Blok teks boleh digunakan sama seperti literal teks standard, dan Java akan menyusun kod dengan cara yang sama. Sebut harga pembukaan mesti diikuti dengan pembatas baris; blok teks tidak boleh digunakan dalam satu baris, jadi kod
String smallBlock = """Only one line""";
akan membawa kepada ralat berikut:
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                          ^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                                   	^
Serpihan HTML ringkas kini boleh ditulis seperti ini:
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
Mari sebutkan beberapa kehalusan yang lebih baik untuk diketahui apabila menggunakan blok teks. Peletakan petikan penutup ternyata penting: ia menentukan cara ruang putih sekali-sekala dikendalikan. Dalam contoh di atas, petikan penutup diselaraskan dengan lekukan teks HTML. Dalam kes ini, pengkompil akan mengalih keluar ruang lekukan, dan sebagai hasilnya kita akan mendapat baris seperti ini:
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
Catatan:baris tersebut akan mengandungi baris baharu di hujung baris. Jika tidak diperlukan, petikan penutup “”” boleh diletakkan terus selepas teg </html>. Jika kita mengalihkan petikan penutup lebih dekat ke jidar kiri, ini akan mengubah jumlah lekukan yang dialih keluar. Jika kami mengalihkannya dua ruang ke kiri, kami akan menambah dua ruang untuk lekukan pada setiap baris baris. Bergerak ke tepi kiri akan menyebabkan semua padding terpelihara. Mengalihkan petikan lebih jauh ke kanan tidak akan memberi kesan dan tidak akan menambah lekukan lagi. Blok teks telah disertakan dalam JDK 13 sebagai ciri pratonton. Ini bermakna mereka belum termasuk dalam spesifikasi bahasa Java yang sepadan. Iaitu, tidak jelas sama ada ciri ini akan menjadi bahagian tetap bahasa atau sama ada ia hanya tetamu di sini. Pada masa ini, pembangun boleh menguji ciri dan memberikan pendapat mereka mengenainya. Nasib blok teks akan bergantung padanya: ciri itu boleh diperbaiki, dan jika anda tidak menyukainya, maka ia boleh dialih keluar sama sekali. Jika anda ingin mencuba blok teks dalam amalan, ingat bahawa ciri pratonton mesti disertakan secara eksplisit untuk menyusun dan dijalankan. Kompilasi:

javac --enable-preview --release 13 TextBlock.java
Untuk menjalankan aplikasi, anda perlu mendayakan ciri pratonton:

java --enable-preview TextBlock
Kelas ini Stringmempunyai tiga kaedah baharu yang melengkapkan perubahan bahasa ini:
  • formatted(): Format rentetan menggunakan rentetan itu sendiri sebagai rentetan format. Setara dengan cabaranformat(this, args)
  • stripIndent(): Mengalih keluar ruang rawak daripada rentetan. Ini berguna jika anda membaca rentetan berbilang baris dan ingin menggunakan pengecualian ruang putih yang sama seperti yang anda lakukan dengan pengisytiharan eksplisit.
  • translateEscapes(): Mengembalikan rentetan dengan urutan melarikan diri (seperti \ r), diterjemahkan kepada nilai Unikod yang sesuai.
Sungguh menarik bahawa kaedah ini baru sahaja muncul, tetapi telah ditandakan sebagai tidak digunakan ... keadaan ini menunjukkan bahawa kaedah ini mungkin dialih keluar dalam versi JDK yang akan datang. Nampaknya agak sipi untuk menambah kaedah baharu dan segera meninggalkannya. Walau bagaimanapun, sila ambil perhatian bahawa kaedah ini dikaitkan dengan ciri pratonton yang boleh ditukar atau dialih keluar. Mungkin memperkenalkan anotasi @PreviewFeatureakan membantu dalam situasi sedemikian, tetapi ia belum termasuk dalam JDK lagi (walaupun dengan tahap kebarangkalian yang tinggi ia akan muncul dalam JDK 14).

JEP 354 : Ungkapan Suis (Pratonton)

Java 12 memperkenalkan cadangan untuk bentuk penulisan ungkapan baharu dengan pernyataan suis - JEP 325 . Ia ternyata menjadi ciri pratonton yang pertama dan nasibnya membuktikan bahawa menyerahkan cadangan kepada pengguna adalah idea yang bagus. Sebelum JDK 12, switchia hanya boleh digunakan sebagai pernyataan yang melakukan tindakan tetapi tidak mengembalikan hasil. Tetapi dalam Java 12 ia membenarkannya digunakan switchsebagai ungkapan yang mengembalikan hasil yang boleh diberikan kepada pembolehubah. Terdapat perubahan lain pada sintaks pernyataan kes dalam switch. Mari lihat contoh daripada JEP untuk memahami cara ini berfungsi.
int numberOfLetters;
switch(dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numberOfLetter = 6;
    break;
  case TUESDAY
    numberOfLetter = 7;
    break;
  case THURSDAY
  case SATURDAY
    numberOfLetter = 8;
    break;
  case WEDNESDAY
    numberOfLetter = 9;
    break;
  default:
   throw new IllegalStateException("Huh?: " + day);
}
Dalam contoh ini, kami menggunakan nilai dayOfWeekuntuk menetapkan nilai kepada numberOfLetters. Disebabkan oleh keanehan kerja pengendali switch, kod ini bukanlah yang paling cantik dan mudah untuk membuat kesilapan. Pertama, jika kita terlupa untuk menggunakan pernyataan breakpada setiap kumpulan label kes, kita akan lalai kepada kumpulan label kes yang seterusnya. Ini boleh menyebabkan ralat yang sukar dicari. Kedua, kita mesti menentukan setiap kumpulan label kes. Jika kita terlupa, maka, sudah tentu, kita akan mendapat ralat pengkompil, bagaimanapun, pilihan ini tidak sesuai. Kod kami juga agak verbose kerana setiap nilai dayOfWeekmesti mempunyai label kes sendiri. Menggunakan sintaks baharu, kami mendapat kod yang lebih bersih dan kurang terdedah kepada ralat:
int numberOfLetters = switch (dayOfWeek) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh?: " + day);
};
Sekarang kita hanya perlu membuat tugasan sekali sahaja (daripada nilai pulangan ungkapan switch) dan boleh menggunakan senarai yang dipisahkan koma untuk label kes. Dan, kerana kami tidak menggunakan operator break, kami menghapuskan masalah yang berkaitan dengannya. Sintaks ungkapan switchmembolehkan kita menggunakan sintaks gaya lama, jadi dalam JDK 12 kita boleh menulisnya seperti ini:
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   break 6;
  case TUESDAY
   break 7;
  case THURSDAY
  case SATURDAY
   break 8;
  case WEDNESDAY
   break 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Menurut komuniti Java, menggunakan lebihan beban breakuntuk menentukan nilai pulangan boleh mengelirukan. Bahasa Java juga membolehkan anda menggunakan break( dan continue) dengan label seperti operator lompat tanpa syarat goto. JEP 354 menukar penggunaan ini break, jadi dalam Java 13 kod kami berubah sedikit:
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Tiga JEP seterusnya dikaitkan dengan Mesin Maya Java.

Arkib CDS Dinamik JEP 350

Sambungan ini membolehkan anda mengarkibkan kelas secara dinamik pada penghujung pelaksanaan aplikasi Java. CDS atau Perkongsian Data Kelas membolehkan anda membungkus semua kelas yang dilancarkan pada permulaan ke dalam arkib khas class data sharing, menggunakan senarai kelas yang sama ini secara lalai. Ini membawa kepada pecutan yang ketara dalam melancarkan aplikasi dan menjimatkan RAM. Sebelum ini, menggunakan AppCDS ialah proses berbilang langkah yang melibatkan mencipta senarai kelas yang berkaitan dan menggunakan senarai itu untuk mencipta arkib yang akan digunakan untuk larian seterusnya. Kini semua yang diperlukan ialah satu pelancaran aplikasi dengan bendera -XX: ArchiveClassesAtExityang menunjukkan lokasi di mana arkib akan ditulis. Dengan pendekatan ini, kelas secara automatik dibungkus ke dalam arkib selepas aplikasi dihentikan seperti biasa.

JEP 351 ZGC : Nyahkomit ingatan yang tidak digunakan

Setahun yang lalu, JDK 11 memperkenalkan ZGC, pemungut sampah berskala rendah yang bersifat eksperimen, boleh skala, dan kependaman rendah. Pada mulanya, ZGC berkelakuan agak pelik: ia tidak membenarkan memori dikembalikan ke sistem pengendalian, walaupun ia tidak lagi diperlukan. Untuk sesetengah persekitaran, seperti bekas, di mana sumber digunakan oleh berbilang perkhidmatan pada masa yang sama, ini mungkin mengehadkan kebolehskalaan dan kecekapan sistem. Timbunan ZGC terdiri daripada apa yang dipanggil ZPages. Apabila ZPages dibersihkan semasa kitaran kutipan sampah, ia dikembalikan kepada ZPageCache. ZPages dalam cache ini disusun mengikut berapa lama ia digunakan. Dalam Java 13, ZGC akan mengembalikan halaman yang telah dikenal pasti sebagai tidak digunakan untuk masa yang lama kepada sistem pengendalian. Dengan cara ini ia boleh digunakan semula untuk proses lain.

JEP 353 Laksanakan semula API Soket lama

Kedua-dua pelaksanaan API java.net.Socketmasih java.net.ServerSocketJDK 1.0. Dalam hal ini, dan semua JDK berikutnya, pelaksanaan API ini menggunakan beberapa teknik (seperti menggunakan tindanan benang sebagai penimbal I/O) yang menjadikannya tidak fleksibel dan sukar untuk dikekalkan. Untuk menyelesaikan masalah ini, pelaksanaan baharu telah disediakan dalam JDK 13 NioSocketImpl. Ia tidak lagi memerlukan kod asli, menjadikannya lebih mudah untuk dipindahkan ke platform yang berbeza. Kelas ini juga menggunakan mekanisme cache penimbal sedia ada (mengelakkan penggunaan tindanan benang untuk tujuan ini) dan mengunci java.util.concurrentdan bukannya kaedah yang disegerakkan. Ini akan memudahkan penyepaduan dengan gentian daripada Project Loom .

API baharu

Kami menyebut sebelum ini bahawa Java 13 termasuk 76 API baharu dalam perpustakaan kelas asas. Mereka meliputi bidang berikut:
  • Kemas kini sokongan Unicode.
  • Tiga kaedah baharu Stringuntuk menyokong blok teks (lihat penerangan JEP 255 di atas).
  • Kelas java.niokini mempunyai mutlak (berbanding dengan relatif) getdan tetapkan kaedah. Mereka, seperti kelas abstrak asas Buffer, termasuk kaedah slice()untuk mendapatkan semula sebahagian daripada penimbal.
  • Kaedah force()kelas MappedByteBuffermemaksa bahagian penimbal untuk ditulis ke storan sokongannya.
  • nio.FileSystemmenambah tiga borang terlebih muatan baharu newFileSystem()untuk mengakses kandungan fail sebagai sistem fail.
  • Kaedah baru yang menarik telah javax.annotation.processing.ProcessingEnvironmentmuncul. isPreviewEnabled(). Ia akan memberitahu anda sama ada ciri pratonton didayakan. Ini menarik kerana anotasi yang dinyatakan di atas @PreviewFeaturetidak akan tersedia sehingga JDK 14 dikeluarkan.
  • DocumentBuilderFactorydan SAXParserFactorydapatkan javax.xml.parserstiga kaedah baharu untuk mencipta contoh yang sedar ruang nama.
Bahan ini berdasarkan artikel oleh Simon Ritter dan dokumentasi rasmi .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION