JavaRush /Java Blog /Random-ID /Jawa 14: apa yang baru?

Jawa 14: apa yang baru?

Dipublikasikan di grup Random-ID
Permasalahan dunia adalah permasalahan dunia, dan Java yang baru sudah sesuai jadwal. Artinya, tepat enam bulan sekali. Versi rilis Java 14 dirilis pada 17 Maret, dan memperkenalkan beberapa inovasi menarik pada bahasa yang ditujukan untuk pengembang. Jawa 14: apa yang baru?  - 1Diantaranya adalah dukungan eksperimental untuk kata kunci rekaman , dukungan untuk pencocokan pola di operator " instanceof ", NullPointerExceptions yang lebih ramah pengguna , "pratinjau" blok teks yang diperluas , saklar default yang diperbarui, dan banyak lagi. Izinkan kami mengingatkan Anda bahwa semua inovasi di Java dimulai dengan proposal perluasan ( JEP, Java Enhancement Proposals ). Pengembang mengusulkan perubahan, perubahan tersebut ditinjau oleh induk Java “resmi”, dan kemudian beberapa perubahan tersebut diterima, setelah itu menjadi bagian dari JDK. Dan sekarang - semuanya beres.

JEP 359: Catatan

Records, juga dikenal sebagai Records, tersedia untuk JDK 14 dalam mode pratinjau, dan ini adalah sesuatu yang benar-benar baru untuk Java. Faktanya, di hadapan kita ada tipe baru yang dikembangkan selama proyek Valhalla . Catatan mirip dengan enumerasi dan memungkinkan Anda menyederhanakan kode Anda. Pada dasarnya, mereka menggantikan kelas yang memiliki status tetapi tidak memiliki perilaku. Sederhananya, ada bidang, tidak ada metode. Dalam kasus kelas, terkadang kita harus menulis banyak kode berulang yang tidak selalu diperlukan: konstruktor, pengakses, sama dengan(), kode hash(), toString(), dll. Untuk menghindari kode berulang ini, Java berencana untuk menggunakan catatan. Ini versi klasiknya:
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
Mari pindah ke Java 14 dan gunakan record:
public record Triangle(int x, int y, int z){}
Itu saja. Harap dicatat bahwa rekaman saat ini ada dalam bentuk pratinjau, jadi untuk mencobanya dalam praktik, Anda perlu mengunduh jdk14 dan memasukkan perintah:
javac —enable-preview —release 14 Triangle.java
Catatan adalah kelas, meski dengan keterbatasan. Mereka tidak dapat memperluas kelas lain atau mendeklarasikan bidang (kecuali private final yang sesuai dengan komponen deklarasi negara bagian). Catatan secara implisit bersifat final dan tidak dapat bersifat abstrak. Catatan berbeda dari kelas biasa karena mereka tidak dapat memisahkan API dari representasinya. Namun hilangnya kebebasan diimbangi dengan peningkatan akurasi. Komponen rekaman juga secara implisit bersifat final.

JEP 305: Pencocokan Pola misalnya (Pratinjau)

Fitur Pencocokan Pola , yang diperkenalkan di Java 14 dalam pratinjau, dirancang untuk menggabungkan pemeriksaan jenis objek dan konversinya dalam operator instanceof . Dengan kata lain, sebelum Java 14, misalnya, sudah ada kode berikut:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Seperti yang Anda lihat, kita harus melemparkan objek ke kelas yang metodenya ingin kita gunakan. Sekarang Java 14 dan fitur Pencocokan Pola yang terhubung memungkinkan Anda mengurangi kode menjadi berikut:
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343 : Alat Pengemasan (Inkubator)

JDK 8 memiliki alat javapackager yang dirancang untuk JavaFX. Namun, setelah pemisahan JavaFX dari Java dengan dirilisnya JDK 11, javapackager yang populer tidak lagi tersedia. Javapackager adalah alat pengemasan. Ini memungkinkan aplikasi Java untuk dikemas sedemikian rupa sehingga dapat diinstal seperti semua program “normal” lainnya. Misalnya, membuat file exe untuk pengguna Windows dan meluncurkan aplikasi Java seperti manusia - dengan klik dua kali. Tentu saja, alat seperti itu sangat kurang, jadi JEP 343 memperkenalkan alat baru, jpackage , yang mengemas aplikasi Java ke dalam paket khusus platform yang berisi semua dependensi yang diperlukan. Format paket yang didukung untuk platform tertentu:
  • Linux: deb dan rpm
  • macOS: pkg dan dmg
  • Windows: MSI dan EXE

JEP 345: Alokasi Memori Sadar NUMA untuk G1

JEP 345 berfungsi semata-mata untuk mengimplementasikan dukungan NUMA (Non-uniform memory access). Ini adalah arsitektur akses memori heterogen, suatu cara untuk mengatur cluster mikroprosesor menjadi sistem multiprosesor di mana memori dapat didistribusikan secara lokal: setiap inti prosesor mendapat sejumlah kecil memori lokal, sementara inti lain memiliki akses ke sana. JEP 345 berencana melengkapi pengumpul sampah G1 dengan kemampuan memanfaatkan arsitektur tersebut. Pendekatan ini antara lain membantu meningkatkan kinerja pada mesin yang sangat bertenaga.

JEP 349: Streaming Acara JFR

Java Flight Recorder (JFR) sekarang menjadi bagian dari OpenJDK dan karenanya tersedia secara gratis. JDK 14 menambahkan API untuk pelacakan peristiwa JFR saat itu juga (JDK Flight Recorder), khususnya untuk mengatur pemantauan berkelanjutan terhadap aplikasi aktif dan tidak aktif. Peristiwa yang sama dicatat seperti pada opsi non-streaming, dengan overhead kurang dari 1%. Dengan cara ini acara akan dialirkan bersamaan dengan opsi non-streaming. Namun, JEP 349 tidak boleh mengizinkan panggilan balik sinkron untuk konsumen terkait. Bahkan data dari catatan yang disimpan dalam memori perantara tidak boleh diakses. Secara teknis, paket jdk.jfr.consumer dalam modul jdk.jfr akan diperluas dengan fungsionalitas untuk akses asinkron ke acara.

JEP 352: Buffer Byte yang Dipetakan Non-Volatil

Seperti yang kita ketahui, Java NIO (New IO) File API telah ada sejak JDK 1.4, dan kemudian diperkenalkan peningkatan baru yang disebut Path. Path merupakan antarmuka yang menggantikan kelas java.io.File sebagai representasi file atau direktori saat kita bekerja di Java NIO. JEP 352 memperluas MappedByteBuffer untuk memuat sebagian data file ke dalam memori non-volatile (NVM). Memori komputer ini, yang datanya tidak akan hilang meskipun daya dimatikan (sering disebut memori persisten), digunakan untuk menyimpan data secara permanen. Proposal peningkatan Java ini menyediakan modul dan kelas baru untuk JDK API: modul jdk.nio.mapmode, yang menawarkan mode baru (READ_ONLY_SYNC, WRITE_ONLY_SYNC) untuk membuat buffer byte yang dipetakan (MappedByteBuffer) yang merujuk pada NVM.

JEP 358: NullPointerException yang Bermanfaat

NullPointerExceptions sekarang akan lebih ramah programmer. Dalam artian uraian pengecualiannya akan jauh lebih informatif dari sebelumnya. Hal ini karena JVM telah diajarkan untuk menganalisis instruksi bytecode program dengan lebih akurat, dan dapat menunjukkan variabel mana yang menghasilkan nilai nol. Katakanlah kita memiliki kode:
a.getMessage().getUserInfo().getName()
Di salah satu Java terbaru kita akan mendapatkan log kesalahan biasa, yang tidak menjawab pertanyaan siapa sebenarnya yang null:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Dan inilah yang akan diberikan Java 14 kepada Anda jika Anda memutuskan untuk mencoba fitur pratinjau ini:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
Rantai ini jauh lebih mudah dipahami dan memungkinkan Anda mengatasi kesalahan lebih cepat.

JEP 361: Beralih Ekspresi (Standar)

Operator Switch yang diperbarui tersedia di Java 12 dan 13 sebelumnya, tetapi hanya sebagai fitur pratinjau, yaitu tidak diaktifkan secara default. Sekarang di JDK 14 semuanya berjalan dengan baik. Java 14 memperkenalkan bentuk blok saklar baru yang disederhanakan dengan label huruf L -> .... Bentuk baru ini menyederhanakan kode dalam beberapa kasus. Berikut beberapa contohnya. Katakanlah kita memiliki enum yang menggambarkan hari-hari dalam seminggu. Kita dapat menulis kode klasik (pra-Java 14):
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Dan berikut ini opsi menggunakan Java 14:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
Anda juga dapat menulis blok multi-baris dan mengembalikan nilai dengan kata kunci hasil yang baru:
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
Ada beberapa hal penting yang perlu diingat saat menggunakan saklar baru . Secara khusus, Anda perlu mengingat bahwa pilihannya harus lengkap. Artinya, untuk semua nilai yang mungkin, harus ada label sakelar yang sesuai. Karena hasil sekarang menjadi kata kunci, kelas yang disebut hasil dimungkinkan di Java 14. Secara umum, jika Anda ingin mempelajari cara menggunakan sakelar yang diperbarui, buka JEP 361 dan pelajari. Banyak informasi menarik disana.

JEP 362: Menghentikan Penggunaan Pelabuhan Solaris dan SPARC

Tampaknya tidak banyak pembaca kami yang mengingat sistem operasi Solaris . Sistem operasi berbasis UNIX ini, dibuat oleh induk Java, Sun Microsystems, digunakan terutama untuk server dengan arsitektur SPARC... Terlalu banyak kata asing per sentimeter persegi? Bukan masalah besar: JEP 362 mengakhiri dukungan untuk platform Solaris/SPARC, Solaris/x64, dan Linux/SPARC. Artinya, port mereka sekarang sudah tidak digunakan lagi, dan di masa mendatang kemungkinan besar port tersebut akan dihapus dari OpenJDK. Namun, versi Java yang lebih lama (sebelum JDK 14) mengenai port Solaris/SPARC, Solaris/x64 dan Linux/SPARC harus berfungsi tanpa modifikasi. Jika Anda penggemar sejarah dan tertarik dengan teknologi di masa lalu, kunjungi Wikipedia dan baca tentang arsitektur SPARС .

JEP 363: Hapus Pengumpul Sampah Concurrent Mark Sweep (CMS).

Pengumpul sampah CMS (Concurrent Mark Sweep) menjadi sasaran penghapusan karena dua tahun lalu ditandai sudah usang dan tidak terawat. Namun, pengguna Java versi lama yang menggunakan CMS GC mungkin akan kesulitan - tujuan JEP ini bukan untuk menghapus pembuat dari rilis JDK sebelumnya. Selain itu, kombinasi algoritme pengumpulan sampah ParallelScavenge dan SerialOld (berjalan dengan opsi "-XX:+UseParallelGC -XX:-UseParallelOldGC") sudah tidak digunakan lagi.

JEP 364: ZGC di macOS dan JEP 365: ZGC di Windows

Ada pengumpul sampah menarik bernama Z Garbage Collector (ZGC) . Ia bekerja dalam mode pasif, dan mencoba meminimalkan penundaan akibat pengumpulan sampah: waktu berhenti saat menggunakan ZGC tidak melebihi 10 ms. Ini dapat bekerja dengan tumpukan kecil dan raksasa (yang memakan banyak terabyte). JEP 364 dan JEP 365 bisa dibilang kembar. JEP 364 menghadirkan Z Garbage Collector ke MacOS. Bagian dari JEP juga menjelaskan fungsionalitas kolektor untuk mengosongkan memori perangkat yang tidak terpakai, seperti yang ditentukan dalam JEP 351 , ini telah terjadi sejak Java 13. Implementasi ZGC di macOS memiliki dua bagian:
  • Dukungan memori multi-pemetaan di macOS
  • Dukungan ZGC untuk reservasi memori berkelanjutan
JEP 365 menyediakan dukungan untuk ZGC yang sudah ada di Windows, dan juga dalam mode eksperimental. Ini adalah sebagai berikut:
  • Dukungan memori multi-pemetaan
  • Dukungan untuk pemetaan memori berdasarkan file halaman ke dalam ruang alamat yang dicadangkan
  • Dukungan untuk memetakan dan membatalkan pemetaan bagian heap yang sewenang-wenang
  • Dukungan untuk melakukan dan tidak melakukan bagian heap yang sewenang-wenang

JEP 366: Menghentikan Kombinasi ParallelScavenge + SerialOld GC

JEP ini tidak lagi menggunakan kombinasi algoritma pengumpulan sampah Parallel Scavenge dan Serial Old. Kombinasi ini harus diaktifkan secara manual menggunakan parameter baris perintah -XX: + UseParallelGC -XX: -UseParallelOldGC. Penulis yakin bahwa kombinasi tersebut sangat spesifik, namun juga memerlukan upaya pemeliharaan yang signifikan. Jadi sekarang opsi -XX: UseParallelOldGC sudah tidak digunakan lagi dan akan muncul peringatan jika digunakan.

JEP 367: Hapus Alat dan API Pack200

Pack200 adalah format arsip yang dioptimalkan untuk menyimpan file kelas Java yang dikompilasi. Alat ini sudah ditandai tidak digunakan lagi sejak Java 11. Sekarang alat API pack200, unpack200 dan Pack200 telah diumumkan secara resmi untuk dihapus dari paket java.util.jar . Teknologi ini diperkenalkan kembali di Java 5 sebagai cara untuk mengatasi bandwidth yang sangat terbatas (modem, menakutkan untuk dikatakan dan diingat, 56k) dan ruang penyimpanan yang tidak mencukupi pada hard drive. Beberapa waktu lalu, Java 9 memperkenalkan skema kompresi baru. Pengembang didorong untuk menggunakan jlink .

JEP 368: Blok Teks (Pratinjau Kedua)

Blok teks pertama kali muncul di Java 13. Ini adalah literal string multiline yang mencegah kebutuhan sebagian besar urutan escape, memformat string secara otomatis, dan juga memungkinkan pengembang memformat string jika perlu. Fitur berguna ini sekarang tersedia di Java 14 (Pratinjau ke-2). Tujuan utama blok teks adalah untuk meningkatkan penanganan literal multi-baris yang membingungkan. Ini sangat menyederhanakan membaca dan menulis kueri SQL, kode HTML dan XML, serta JSON. Contoh HTML tanpa blok teks:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
Cara merepresentasikannya dengan blok teks:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Pembatas pembuka adalah rangkaian tiga karakter kutip ganda ("" "), diikuti dengan nol spasi atau lebih, lalu pembatas baris. Isinya dimulai dari karakter pertama setelah pembatas baris pembatas pembuka. Pembatas penutup adalah rangkaian tiga karakter kutip ganda " _ ) dipilih sehingga karakter dapat ditampilkan tanpa keluar, dan juga secara visual membedakan blok teks dari string literal. Pada awal tahun 2019, JEP 355 mengusulkan blok teks sebagai kelanjutan dari JEP 326 (Raw String literals), tetapi blok tersebut ditarik. Belakangan tahun itu, JDK 13 memperkenalkan fitur pratinjau blok teks, dan sekarang Java 14 telah menambahkan dua escape sequence baru. Ini adalah terminator garis, dilambangkan dengan \, dan yang kedua adalah untuk spasi tunggal, dilambangkan dengan /s. Contoh penggunaan baris baru tanpa blok teks:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
Dan sekarang dengan urutan escape \<line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Urutan escape \s digunakan untuk memperhitungkan spasi tambahan, yang diabaikan oleh kompiler secara default. Ini mempertahankan semua spasi yang mendahuluinya. Contoh:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1dan text2identik.

JEP 370: API Akses Memori Asing (Inkubator)

Banyak perpustakaan dan program Java populer memiliki akses ke memori eksternal. Misalnya Ignite, MapDB, Memcached dan Netty ByteBuf API. Dengan melakukan hal ini, mereka dapat menghindari biaya dan ketidakpastian yang terkait dengan pengumpulan sampah (terutama saat menyajikan cache yang besar), berbagi memori di beberapa proses, dan membuat serialisasi dan deserialisasi konten memori dengan memetakan file di memori (misalnya, menggunakan mmap). Namun Java API masih belum memiliki solusi yang cocok untuk mengakses memori eksternal. JDK 14 menyertakan pratinjau Foreign-Memory Access API , yang memungkinkan aplikasi Java mengakses wilayah memori di luar tumpukan JVM dengan aman dan efisien menggunakan abstraksi MemorySegment, MemoryAddress, dan MemoryLayout baru.

kesimpulan

Jadi apa yang Anda pikirkan? Dibandingkan dengan Java 13, Java 14 baru menawarkan banyak peningkatan yang lebih penting di berbagai bidang. Kemungkinan besar, hal yang paling penting bagi pengembang adalah peralihan yang diperbarui, pengecualian NullPointerExceptions yang diperluas, dan catatan. Atau tidak?.. Jangan lupa untuk mencoba fitur-fitur baru Java 14, sangat berguna bahkan untuk pemula sekalipun. Semoga sukses dengan studimu!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION