JavaRush /Java Blog /Random-ID /Java 13: Fitur Baru

Java 13: Fitur Baru

Dipublikasikan di grup Random-ID
Kami sudah terbiasa dengan kenyataan bahwa rilis JDK baru muncul setiap enam bulan. Sejauh ini, pendekatan ini telah membuahkan hasil, dan kekhawatiran beberapa pengembang bahwa mereka tidak akan mengikuti pembaruan telah sia-sia: hanya ada sedikit perubahan dalam enam bulan dan tidak seglobal sebelumnya. Nah, programmer pemula mungkin tidak memperhatikan inovasi sama sekali. Java 13: fitur baru - 1Namun, lebih baik bagi pengembang perangkat lunak di masa depan untuk terus mengikuti inovasi. Dalam artikel ini, kami secara tradisional akan menjelaskan proposal perluasan yang diterima (JEPs). Java 13 hanya menyertakan lima JEP dan 76 elemen pustaka inti baru (hampir setengahnya merupakan tambahan sederhana pada paket java.io).

JEP 355 : Blok Teks (Pratinjau)

Mari kita mulai dengan mengubah sintaks bahasanya. Yang paling penting adalah blok teks. Mereka memungkinkan Anda menghindari pelolosan karakter dan mengetahui cara memformat string. Anda mungkin ingat bahwa JDK 12 tidak menyertakan fitur Raw String Literals (JEP 326) yang diharapkan untuk bekerja dengan string literal. Di Java 13, digantikan oleh JEP 355 dengan blok teksnya. Anda mungkin ingat bahwa di Java, sebuah string dibungkus dengan tanda kutip ganda. Ini bagus, tetapi masalahnya adalah sebuah baris tidak boleh menempati lebih dari satu baris file sumber (untuk menghindari kebingungan dengan baris Java, di sini kita akan menyebut baris file sebagai "baris"). Baiklah, mari kita berkeliling dan menggunakan, misalnya, simbol \njika diperlukan jeda, atau rangkaian ekspresi multiline. Hasilnya tidak terlalu bagus! Literal teks dengan fragmen HTML, XML, SQL, atau JSON yang tertanam sangat rumit. Semua pelolosan, penggabungan, dan pengeditan manual ini membuat kode menjadi tidak nyaman untuk ditulis dan sulit dibaca. Blok teks mencoba memecahkan masalah ini. Mereka memulai uh... dengan tanda kutip ganda tiga kali lipat dan diakhiri dengan tanda kutip (saya tahu, kedengarannya tidak terlalu bagus). Segala sesuatu di antara tanda kutip ditafsirkan sebagai bagian dari baris, termasuk baris baru. Blok teks dapat digunakan sama persis dengan literal teks standar, dan Java akan mengkompilasi kode dengan cara yang sama. Kutipan pembuka harus diikuti dengan pembatas garis; blok teks tidak dapat digunakan dalam satu baris, begitu pula kodenya
String smallBlock = """Only one line""";
akan menyebabkan kesalahan 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""";
                                   	^
Fragmen HTML sederhana sekarang dapat ditulis seperti ini:
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
Mari sebutkan beberapa seluk-beluk yang sebaiknya diperhatikan saat menggunakan blok teks. Penempatan tanda kutip penutup ternyata penting: ini menentukan bagaimana spasi sesekali ditangani. Pada contoh di atas, tanda kutip penutup disejajarkan dengan lekukan teks HTML. Dalam hal ini, kompiler akan menghapus spasi indentasi, dan sebagai hasilnya kita akan mendapatkan baris seperti ini:
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
Catatan:baris seperti itu akan berisi baris baru di akhir baris. Jika tidak diperlukan, tanda kutip penutup “”” dapat ditempatkan langsung setelah tag </html>. Jika kita memindahkan tanda kutip penutup lebih dekat ke margin kiri, ini akan mengubah jumlah indentasi yang dihilangkan. Jika kita memindahkannya dua spasi ke kiri, kita akan menambahkan dua spasi untuk lekukan pada setiap baris garis. Pindah ke tepi kiri akan menyebabkan semua padding dipertahankan. Memindahkan tanda kutip lebih jauh ke kanan tidak akan berpengaruh dan tidak akan menambah lekukan lagi. Blok teks disertakan dalam JDK 13 sebagai fitur pratinjau. Artinya, mereka belum disertakan dalam spesifikasi bahasa Java yang sesuai. Artinya, tidak jelas apakah fitur ini akan menjadi bagian permanen dari bahasa tersebut atau hanya menjadi tamu di sini. Saat ini, pengembang dapat menguji fitur tersebut dan memberikan pendapat mereka mengenai fitur tersebut. Nasib blok teks akan bergantung padanya: fitur tersebut dapat ditingkatkan, dan jika Anda tidak menyukainya, maka fitur tersebut dapat dihapus sama sekali. Jika Anda ingin mencoba blok teks dalam praktiknya, ingatlah bahwa fitur pratinjau harus disertakan secara eksplisit agar dapat dikompilasi dan dijalankan. Kompilasi:

javac --enable-preview --release 13 TextBlock.java
Untuk menjalankan aplikasi, Anda perlu mengaktifkan fitur pratinjau:

java --enable-preview TextBlock
Kelas Stringmemiliki tiga metode baru yang melengkapi perubahan bahasa ini:
  • formatted(): Memformat string menggunakan string itu sendiri sebagai format string. Setara dengan tantanganformat(this, args)
  • stripIndent(): Menghapus spasi acak dari sebuah string. Ini berguna jika Anda membaca string multiline dan ingin menerapkan pengecualian spasi putih yang sama seperti yang Anda lakukan dengan deklarasi eksplisit.
  • translateEscapes(): Mengembalikan string dengan urutan escape (seperti \ r), diterjemahkan ke nilai Unicode yang sesuai.
Sangat menarik bahwa metode ini baru saja muncul, tetapi sudah ditandai sebagai tidak digunakan lagi ... keadaan ini menunjukkan bahwa metode tersebut mungkin dihapus di versi JDK yang akan datang. Tampaknya agak eksentrik untuk menambahkan metode baru dan segera meninggalkannya. Namun perlu diingat bahwa metode ini terkait dengan fitur pratinjau yang dapat diubah atau dihapus. Mungkin memperkenalkan anotasi @PreviewFeatureakan membantu dalam situasi seperti itu, tetapi anotasi tersebut belum disertakan dalam JDK (walaupun dengan kemungkinan besar anotasi tersebut akan muncul di JDK 14).

JEP 354 : Ekspresi Pengalihan (Pratinjau)

Java 12 memperkenalkan proposal untuk bentuk penulisan ekspresi baru dengan pernyataan switch - JEP 325 . Ternyata ini adalah fitur pratinjau pertama dan nasibnya membuktikan bahwa mengirimkan proposal kepada pengguna adalah ide bagus. Sebelum JDK 12, switchini hanya dapat digunakan sebagai pernyataan yang melakukan suatu tindakan tetapi tidak memberikan hasil. Namun di Java 12 diperbolehkan untuk digunakan switchsebagai ekspresi yang mengembalikan hasil yang dapat ditetapkan ke variabel. Ada perubahan lain pada sintaksis pernyataan kasus di dalam switch. Mari kita lihat contoh dari JEP untuk memahami cara kerjanya.
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 ke numberOfLetters. Karena kekhasan pekerjaan operator switch, kode ini bukan yang terindah dan mudah membuat kesalahan. Pertama, jika kita lupa untuk menerapkan pernyataan breakke setiap kelompok label kasus, kita akan menetapkan default ke kelompok label kasus berikutnya. Hal ini dapat menyebabkan kesalahan yang sulit ditemukan. Kedua, kita harus mendefinisikan setiap kelompok label kasus. Jika kita lupa, tentu saja kita akan mendapatkan kesalahan kompiler, namun opsi ini tidak ideal. Kode kita juga cukup bertele-tele karena setiap nilai dayOfWeekharus memiliki label hurufnya sendiri. Dengan menggunakan sintaks baru, kita mendapatkan kode yang jauh lebih bersih dan tidak terlalu rawan kesalahan:
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 penugasan satu kali (dari nilai kembalian ekspresi switch) dan dapat menggunakan daftar yang dipisahkan koma untuk label kasus. Dan, karena kami tidak menggunakan operator break, kami menghilangkan masalah yang terkait dengannya. Sintaks ekspresi switchmemungkinkan kita menggunakan sintaks gaya lama, jadi di JDK 12 kita bisa 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 komunitas Java, menggunakan kelebihan beban breakuntuk menentukan nilai kembalian dapat membingungkan. Bahasa Java juga memungkinkan Anda untuk menggunakan break( dan continue) dengan label seperti operator lompat tanpa syarat goto. JEP 354 mengubah penggunaan ini break, jadi di Java 13 kode kami sedikit berubah:
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 berikutnya dikaitkan dengan Java Virtual Machine.

Arsip CD Dinamis JEP 350

Ekstensi ini memungkinkan Anda mengarsipkan kelas secara dinamis di akhir eksekusi aplikasi Java. CDS atau Berbagi Data Kelas memungkinkan Anda mengemas semua kelas yang diluncurkan saat startup ke dalam arsip khusus class data sharing, menggunakan daftar kelas yang sama secara default. Hal ini menyebabkan percepatan yang signifikan dalam meluncurkan aplikasi dan menghemat RAM. Sebelumnya, penggunaan AppCDS adalah proses multi-langkah yang melibatkan pembuatan daftar kelas yang relevan dan menggunakan daftar tersebut untuk membuat arsip yang akan digunakan untuk proses selanjutnya. Sekarang yang diperlukan hanyalah satu peluncuran aplikasi dengan tanda -XX: ArchiveClassesAtExityang menunjukkan lokasi di mana arsip akan ditulis. Dengan pendekatan ini, kelas secara otomatis dikemas ke dalam arsip setelah aplikasi dihentikan secara normal.

JEP 351 ZGC : Batalkan komitmen memori yang tidak digunakan

Setahun yang lalu, JDK 11 memperkenalkan ZGC, pengumpul sampah eksperimental, terukur, dan berlatensi rendah. Pada awalnya, ZGC berperilaku agak aneh: ZGC tidak mengizinkan memori dikembalikan ke sistem operasi, meskipun tidak lagi diperlukan. Untuk beberapa lingkungan, seperti container, di mana sumber daya digunakan oleh beberapa layanan secara bersamaan, hal ini dapat membatasi skalabilitas dan efisiensi sistem. Tumpukan ZGC terdiri dari apa yang disebut ZPages. Ketika ZPages dibersihkan selama siklus pengumpulan sampah, ZPage dikembalikan ke ZPageCache. ZPages dalam cache ini diurutkan berdasarkan seberapa baru mereka digunakan. Di Java 13, ZGC akan mengembalikan halaman yang telah diidentifikasi sudah lama tidak digunakan ke sistem operasi. Dengan cara ini mereka dapat digunakan kembali untuk proses lainnya.

JEP 353 Mengimplementasikan kembali Socket API lama

Kedua implementasi API tersebut java.net.Socketmasih java.net.ServerSocketJDK 1.0. Dalam JDK ini, dan semua JDK berikutnya, implementasi API ini menggunakan beberapa teknik (seperti menggunakan tumpukan thread sebagai buffer I/O) yang membuatnya tidak fleksibel dan sulit untuk dipelihara. Untuk mengatasi masalah ini, implementasi baru disediakan di JDK 13 NioSocketImpl. Ini tidak lagi memerlukan kode asli, sehingga lebih mudah untuk porting ke platform yang berbeda. Kelas ini juga menggunakan mekanisme cache buffer yang ada (menghindari penggunaan tumpukan thread untuk tujuan ini) dan metode penguncian java.util.concurrentdaripada metode yang disinkronkan. Ini akan menyederhanakan integrasi dengan serat dari Project Loom .

API baru

Kami telah menyebutkan sebelumnya bahwa Java 13 menyertakan 76 API baru di perpustakaan kelas dasar. Mereka mencakup bidang-bidang berikut:
  • Pembaruan dukungan Unicode.
  • Tiga metode baru Stringuntuk mendukung blok teks (lihat penjelasan JEP 255 di atas).
  • Kelas java.niosekarang memiliki absolut (sebagai lawan relatif) getdan mengatur metode. Mereka, seperti kelas abstrak dasar Buffer, menyertakan metode slice()untuk mengambil bagian dari buffer.
  • Metode force()kelas MappedByteBuffermemaksa bagian buffer untuk ditulis ke penyimpanan pendukungnya.
  • nio.FileSystemmenambahkan tiga formulir baru yang kelebihan beban newFileSystem()untuk mengakses konten file sebagai sistem file.
  • Sebuah metode baru yang menarik telah javax.annotation.processing.ProcessingEnvironmentmuncul. isPreviewEnabled(). Ini akan memberi tahu Anda apakah fitur pratinjau diaktifkan. Ini menarik karena anotasi yang disebutkan di atas @PreviewFeaturetidak akan tersedia hingga JDK 14 dirilis.
  • DocumentBuilderFactorydan SAXParserFactorydapatkan javax.xml.parserstiga metode baru untuk membuat instance namespace-aware.
Materi ini didasarkan pada artikel oleh Simon Ritter dan dokumentasi resmi .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION