JavaRush /Blog Java /Random-MS /Java 14: apa yang baharu?

Java 14: apa yang baharu?

Diterbitkan dalam kumpulan
Masalah dunia adalah masalah dunia, dan Java baharu mengikut jadual. Iaitu, tepat sekali setiap enam bulan. Versi keluaran Java 14 telah dikeluarkan pada 17 Mac, dan memperkenalkan beberapa inovasi menarik kepada bahasa yang ditujukan kepada pembangun. Java 14: apa yang baharu?  - 1Antaranya ialah sokongan percubaan untuk kata kunci rekod , sokongan untuk padanan corak dalam operator " instanceof ", NullPointerExceptions yang lebih mesra pengguna , "pratonton" blok teks yang diperluas , suis lalai yang dikemas kini dan banyak lagi. Biar kami mengingatkan anda bahawa semua inovasi dalam Java bermula dengan cadangan sambungan ( JEP, Cadangan Peningkatan Java ). Pembangun mencadangkan perubahan, ia disemak oleh ibu bapa Java "rasmi", dan kemudian beberapa perubahan itu diterima, selepas itu ia menjadi sebahagian daripada JDK. Dan sekarang - tentang segala-galanya dalam susunan.

JEP 359: Rekod

Rekod, juga dikenali sebagai Rekod, tersedia untuk JDK 14 dalam mod pratonton, dan ini adalah sesuatu yang benar-benar baharu untuk Java. Malah, kami mempunyai jenis baharu yang telah dibangunkan semasa projek Valhalla . Rekod adalah serupa dengan penghitungan dan membolehkan anda memudahkan kod anda. Pada asasnya, mereka menggantikan kelas yang mempunyai keadaan tetapi tiada tingkah laku. Ringkasnya, ada medan, tiada kaedah. Dalam kes kelas, kadangkala kita perlu menulis banyak kod berulang yang tidak selalu diperlukan: ​​pembina, pengakses, equals(), hashCode(), toString(), dll. Untuk mengelakkan kod berulang ini, Java merancang untuk menggunakan rekod. Berikut ialah versi klasik:
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 beralih ke Java 14 dan gunakan rekod:
public record Triangle(int x, int y, int z){}
Itu sahaja. Sila ambil perhatian bahawa rakaman pada masa ini wujud dalam bentuk pratonton, jadi untuk mencubanya dalam amalan anda perlu memuat turun jdk14 dan masukkan arahan:
javac —enable-preview —release 14 Triangle.java
Rekod adalah kelas, walaupun dengan batasan. Mereka tidak boleh melanjutkan kelas lain atau mengisytiharkan medan (kecuali akhir peribadi yang sepadan dengan komponen pengisytiharan negeri). Rekod secara tersirat adalah muktamad dan tidak boleh abstrak. Rekod berbeza daripada kelas biasa kerana mereka tidak boleh memisahkan API mereka daripada perwakilannya. Tetapi kehilangan kebebasan diimbangi oleh peningkatan ketepatan. Komponen rekod juga secara tersirat adalah muktamad.

JEP 305: Padanan Corak untuk contoh (Pratonton)

Ciri Padanan Corak , yang diperkenalkan dalam Java 14 dalam pratonton, direka bentuk untuk menggabungkan pemeriksaan jenis objek dan penukarannya dalam pengendali instanceof . Dengan kata lain, sebelum Java 14 akan ada, sebagai contoh, kod berikut:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Seperti yang anda lihat, kita mesti menghantar objek ke kelas yang kaedahnya ingin kita gunakan. Kini Java 14 dan ciri Padanan Corak yang disambungkan membolehkan anda mengurangkan kod kepada yang berikut:
Object object = Violin;

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

JEP 343: Alat Pembungkusan (Inkubator)

JDK 8 mempunyai alat javapackager yang direka untuk JavaFX. Walau bagaimanapun, berikutan pemisahan JavaFX dari Java dengan keluaran JDK 11, javapackager yang popular tidak lagi tersedia. Javapackager ialah alat pembungkusan. Ia membenarkan aplikasi Java dibungkus dengan cara yang boleh dipasang seperti semua program "biasa" yang lain. Sebagai contoh, buat fail exe untuk pengguna Windows dan lancarkan aplikasi Java seperti manusia - dengan klik dua kali. Sudah tentu, alat sedemikian sangat kekurangan, jadi JEP 343 memperkenalkan alat baharu, jpackage , yang membungkus aplikasi Java ke dalam pakej khusus platform yang mengandungi semua kebergantungan yang diperlukan. Format pakej yang disokong untuk platform tertentu:
  • Linux: deb dan rpm
  • macOS: pkg dan dmg
  • Windows: MSI dan EXE

JEP 345: Peruntukan Memori NUMA-Aware untuk G1

JEP 345 berfungsi semata-mata untuk melaksanakan sokongan NUMA (Akses memori tidak seragam). Ini adalah seni bina capaian memori heterogen, satu cara untuk menyediakan kluster mikropemproses ke dalam sistem berbilang pemproses di mana memori boleh diedarkan secara tempatan: setiap teras pemproses mendapat sejumlah kecil memori tempatan, manakala teras lain mempunyai akses kepadanya. JEP 345 merancang untuk melengkapkan pengumpul sampah G1 dengan keupayaan untuk memanfaatkan seni bina tersebut. Antara lain, pendekatan ini membantu meningkatkan prestasi pada mesin yang sangat berkuasa.

JEP 349: Penstriman Acara JFR

Java Flight Recorder (JFR) kini merupakan sebahagian daripada OpenJDK dan oleh itu tersedia secara percuma. JDK 14 menambah API untuk penjejakan semasa penerbangan acara JFR (JDK Flight Recorder), khususnya untuk mengatur pemantauan berterusan aplikasi aktif dan tidak aktif. Peristiwa yang sama direkodkan seperti untuk pilihan bukan penstriman, dengan overhed kurang daripada 1%. Dengan cara ini acara akan distrim pada masa yang sama dengan pilihan bukan penstriman. Walau bagaimanapun, JEP 349 tidak boleh membenarkan panggilan balik segerak untuk pengguna yang sepadan. Malah data daripada rekod yang disimpan dalam memori perantaraan tidak boleh diakses. Secara teknikal, pakej jdk.jfr.consumer dalam modul jdk.jfr akan dilanjutkan dengan fungsi untuk akses tak segerak kepada acara.

JEP 352: Penampan Bait Dipeta Tidak Meruap

Seperti yang kita ketahui, Java NIO (New IO) File API telah wujud sejak JDK 1.4, dan kemudian peningkatan baharu yang dipanggil Path telah diperkenalkan. Path ialah antara muka yang menggantikan kelas java.io.File sebagai perwakilan fail atau direktori apabila kami bekerja dalam Java NIO. JEP 352 memanjangkan MappedByteBuffer untuk memuatkan sebahagian data fail ke dalam memori tidak meruap (NVM). Memori komputer ini, di mana data tidak akan hilang walaupun kuasa dimatikan (sering dipanggil ingatan baca sahaja), digunakan untuk menyimpan data secara kekal. Cadangan peningkatan Java ini menyediakan modul dan kelas baharu untuk API JDK: modul jdk.nio.mapmode, yang menawarkan mod baharu (READ_ONLY_SYNC, WRITE_ONLY_SYNC) untuk mencipta penimbal bait yang dipetakan (MappedByteBuffer) merujuk kepada NVM.

JEP 358: NullPointerExceptions Berguna

NullPointerExceptions kini akan menjadi lebih mesra pengaturcara. Dalam erti kata bahawa perihalan pengecualian akan menjadi lebih bermaklumat daripada sebelumnya. Ini kerana JVM telah diajar untuk menganalisis arahan bytecode program dengan lebih tepat, dan ia boleh menunjukkan pembolehubah mana yang membawa kepada nilai sifar. Katakan kita mempunyai kod:
a.getMessage().getUserInfo().getName()
Dalam mana-mana Java terkini kami akan mendapat log ralat biasa, yang tidak menjawab persoalan siapa sebenarnya yang batal:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Dan inilah yang Java 14 akan berikan kepada anda jika anda memutuskan untuk mencuba ciri pratonton 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)
Rantaian ini lebih mudah difahami dan membolehkan anda menangani ralat dengan lebih pantas.

JEP 361: Ungkapan Tukar (Standard)

Pengendali Suis yang dikemas kini tersedia dalam Java 12 dan 13 sebelumnya, tetapi hanya sebagai ciri pratonton, iaitu, ia tidak didayakan secara lalai. Kini dalam JDK 14 semuanya berfungsi di luar kotak. Java 14 memperkenalkan bentuk ringkas baharu bagi blok suis dengan kes L -> ... label. Borang baharu memudahkan kod dalam beberapa kes. Berikut adalah beberapa contoh. Katakan kita mempunyai enum yang menerangkan hari dalam seminggu. Kita boleh menulis kod 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 inilah pilihan 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 boleh menulis blok berbilang baris dan mengembalikan nilai dengan kata kunci hasil baharu:
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;
    }
};
Terdapat beberapa perkara penting yang perlu diingat apabila menggunakan suis baharu s . Khususnya, anda perlu ingat bahawa pilihan mestilah lengkap. Iaitu, untuk semua nilai yang mungkin mesti ada label suis yang sepadan. Memandangkan hasil kini ialah kata kunci, kelas bernama hasil boleh didapati di Java 14. Secara umum, jika anda ingin mengetahui cara menggunakan suis yang dikemas kini, pergi ke JEP 361 dan kaji. Terdapat banyak maklumat menarik di sana.

JEP 362: Menamatkan Pelabuhan Solaris dan SPARC

Tidak mungkin ramai pembaca kami ingat tentang sistem pengendalian Solaris . Sistem pengendalian berasaskan UNIX ini, yang dicipta oleh ibu bapa Java, Sun Microsystems, digunakan terutamanya untuk pelayan pada seni bina SPARC... Terlalu banyak perkataan yang tidak dikenali bagi setiap sentimeter persegi? Bukan masalah besar: JEP 362 menamatkan sokongan untuk platform Solaris/SPARC, Solaris/x64 dan Linux/SPARC. Iaitu, port mereka kini Ditamatkan, dan pada masa hadapan mereka kemungkinan besar akan dialih keluar daripada OpenJDK. Walau bagaimanapun, versi lama Java (sebelum JDK 14) mengenai port Solaris/SPARC, Solaris/x64 dan Linux/SPARC harus berfungsi tanpa pengubahsuaian. Jika anda seorang peminat sejarah dan berminat dengan teknologi masa lalu yang tidak begitu jauh, pergi ke Wikipedia dan baca tentang seni bina SPARС .

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

Pengumpul sampah CMS (Concurrent Mark Sweep) disasarkan untuk dialih keluar kerana dua tahun lalu ia ditandakan sebagai usang dan dibiarkan tidak diselenggara. Walau bagaimanapun, pengguna versi Java yang lebih lama menggunakan CMS GC boleh menghembus nafas - tujuan JEP ini bukan untuk mengalih keluar pembina daripada keluaran JDK terdahulu. Selain itu, gabungan algoritma pengumpulan sampah ParallelScavenge dan SerialOld (berjalan dengan pilihan "-XX:+UseParallelGC -XX:-UseParallelOldGC") telah ditamatkan.

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

Terdapat pemungut sampah yang menarik bernama Z Garbage Collector (ZGC) . Ia berfungsi dalam mod pasif dan cuba meminimumkan kelewatan akibat pengumpulan sampah: masa berhenti apabila menggunakan ZGC tidak melebihi 10 ms. Ia boleh berfungsi dengan timbunan kecil dan gergasi (yang mengambil banyak terabait). JEP 364 dan JEP 365 boleh dikatakan kembar. JEP 364 membawa Z Pengumpul Sampah ke MacOS. Sebahagian daripada JEP juga menerangkan fungsi pengumpul untuk membebaskan memori peranti yang tidak digunakan, seperti yang dinyatakan dalam JEP 351 , ini telah berlaku sejak Java 13. Pelaksanaan ZGC pada macOS mempunyai dua bahagian:
  • Sokongan memori berbilang pemetaan pada macOS
  • Sokongan ZGC untuk tempahan memori berterusan
JEP 365 menyediakan sokongan untuk ZGC yang sudah ada pada Windows, dan juga dalam mod percubaan. Ia adalah seperti berikut:
  • Sokongan memori berbilang pemetaan
  • Sokongan untuk pemetaan memori berdasarkan fail halaman ke dalam ruang alamat yang dikhaskan
  • Sokongan untuk memetakan dan menyahpeta bahagian timbunan sewenang-wenangnya
  • Sokongan untuk melakukan dan tidak mengikat bahagian timbunan sewenang-wenangnya

JEP 366: Menamatkan Gabungan ParallelScavenge + SerialOld GC

JEP ini menafikan gabungan algoritma kutipan sampah Parallel Scavenge dan Serial Old. Gabungan ini perlu didayakan secara manual menggunakan parameter baris arahan -XX: + UseParallelGC -XX: -UseParallelOldGC. Penulis percaya bahawa gabungan itu sangat spesifik, tetapi juga memerlukan usaha penyelenggaraan yang ketara. Jadi sekarang pilihan -XX: UseParallelOldGC ditamatkan dan amaran akan muncul jika digunakan.

JEP 367: Alih keluar Alat dan API Pack200

Pack200 ialah format arkib yang dioptimumkan untuk menyimpan fail kelas Java yang disusun. Alat ini telah ditandai sebagai tidak digunakan sejak Java 11. Kini alat API pack200, unpack200 dan Pack200 telah diumumkan secara rasmi untuk dialih keluar daripada pakej java.util.jar . Teknologi ini diperkenalkan semula di Java 5 sebagai cara menangani lebar jalur yang sangat terhad (modem, ia menakutkan untuk disebut dan diingat, 56k) dan ruang storan yang tidak mencukupi pada cakera keras. Beberapa ketika dahulu, Java 9 memperkenalkan skema mampatan baharu. Pembangun digalakkan menggunakan jlink .

JEP 368: Blok Teks (Pratonton Kedua)

Blok teks mula-mula muncul di Java 13. Ia adalah literal rentetan berbilang baris yang menghalang keperluan untuk kebanyakan urutan pelarian, memformat rentetan secara automatik dan juga membenarkan pembangun memformat rentetan jika perlu. Ciri berguna ini kini tersedia dalam Java 14 (Pratonton Kedua). Tujuan utama blok teks adalah untuk meningkatkan pengendalian literal berbilang baris yang mengelirukan. Ini sangat memudahkan membaca dan menulis pertanyaan SQL, kod 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";
Bagaimana untuk mewakili perkara yang sama dengan blok teks:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Pembatas pembuka ialah jujukan tiga aksara petikan berganda ("" "), diikuti dengan sifar atau lebih ruang, dan kemudian pembatas baris. Kandungan bermula pada aksara pertama selepas pembatas baris bagi pembatas pembuka. Pembatas penutup ialah urutan tiga aksara petikan berganda " _ ) telah dipilih supaya aksara itu boleh dipaparkan tanpa melarikan diri, dan juga membezakan secara visual blok teks daripada rentetan literal. Pada awal tahun 2019, JEP 355 mencadangkan blok teks sebagai kesinambungan JEP 326 (harfiah Rentetan Mentah), tetapi ia telah ditarik balik. Kemudian pada tahun itu, JDK 13 memperkenalkan ciri pratonton blok teks, dan kini Java 14 telah menambah dua jujukan pelarian baharu. Ini ialah penamat baris, dilambangkan \, dan yang kedua adalah untuk ruang tunggal, dilambangkan /s. Contoh menggunakan baris baharu tanpa blok teks:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
Dan sekarang dengan urutan melarikan diri \<line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Urutan melarikan diri \s digunakan untuk mengambil kira ruang putih mengekori, yang diabaikan oleh pengkompil secara lalai. Ia mengekalkan semua ruang putih yang mendahuluinya. Contoh:
String text1 = """
               line1
               line2 \s
               line3
               """;

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

JEP 370: API Akses Memori Asing (Inkubator)

Banyak perpustakaan dan program Java yang popular mempunyai akses kepada memori luaran. Contohnya, Ignite, MapDB, Memcached dan Netty ByteBuf API. Dengan berbuat demikian, mereka boleh mengelakkan kos dan ketidakpastian yang berkaitan dengan kutipan sampah (terutamanya apabila menyediakan cache yang besar), berkongsi memori merentas berbilang proses dan mensiri dan menyahsiri kandungan memori dengan memetakan fail dalam ingatan (contohnya, menggunakan mmap). Walau bagaimanapun, API Java masih tidak mempunyai penyelesaian yang sesuai untuk mengakses memori luaran. JDK 14 termasuk pratonton API Akses Memori Asing , yang membenarkan aplikasi Java mengakses kawasan memori dengan selamat dan cekap di luar timbunan JVM menggunakan abstraksi MemorySegment, MemoryAddress dan MemoryLayout baharu.

kesimpulan

Jadi apa pendapat anda? Berbanding dengan Java 13, Java 14 baharu menawarkan banyak peningkatan yang lebih penting dalam pelbagai bidang. Kemungkinan besar, yang paling penting untuk pembangun ialah suis yang dikemas kini, pengecualian lanjutan NullPointerExceptions dan rekod. Atau tidak?.. Jangan lupa untuk mencuba ciri-ciri baru Java 14, ia sangat berguna walaupun untuk pemula. Semoga berjaya dengan pelajaran anda!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION