JavaRush /Java Blog /Random-ID /Java 11 dirilis: fitur dan kemampuan baru

Java 11 dirilis: fitur dan kemampuan baru

Dipublikasikan di grup Random-ID
Sebelumnya, versi baru Java jarang muncul dan mengalami penundaan. Kini Oracle berhasil mempertahankan ritme “Java baru setiap enam bulan” yang ditetapkan sendiri. Jadi beberapa hari yang lalu, sesuai jadwal, kami akhirnya menerima Java SE 11 dan implementasi JDK (Java Development Kit). Java 11 dirilis: fitur dan kemampuan baru - 1Seperti biasa, versi baru akan kompatibel dengan versi lama, dan dukungan untuk Java 11 akan berakhir paling lambat Desember 2026.

Fitur baru di Java SE 11 (dapat dilihat oleh pengembang)

Ingatlah bahwa di Jawa, perubahan dilakukan melalui implementasi JEP “Proposal Peningkatan JDK”. JEP adalah proposal untuk meningkatkan OpenJDK dan dapat disetujui, ditunda, atau ditolak. Intinya, kumpulan JEP adalah strategi pengembangan OpenJDK. Dalam tanda kurung siku sebelum “fitur” baru kami akan menunjukkan nomor JEP yang sesuai. [323] Sintaks Variabel Lokal untuk Parameter Lambda - sintaks var untuk parameter lambda Java 10 memperkenalkan kata kunci var, yang memungkinkan untuk tidak secara eksplisit menentukan jenis variabel lokal. Ini menyederhanakan kodenya. JEP 323 memperluas penggunaan sintaksis ini dengan ekspresi lambda. Contoh sederhana:
list.stream ()
                 .map ((var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
Seperti yang ditulis oleh Simon Ritter , seorang penginjil Java terkenal, seorang programmer Java berpengalaman akan mencatat bahwa penggunaan var dalam kasus ini mungkin tidak diperlukan, karena kode di atas dapat diganti dengan yang berikut:
list.stream ()
                  .map (s -> s.toLowerCase ())
                  .collect (Collectors.toList ());
Lalu mengapa mendukung var? Hanya ada satu kasus khusus - ketika Anda ingin menambahkan anotasi ke parameter lambda. Ini tidak dapat dilakukan tanpa melibatkan beberapa tipe, dan untuk menghindari penggunaan tipe eksplisit, kita dapat menyederhanakan semuanya menggunakan var seperti ini:
list.stream ()
                 .map ((@ Notnull var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
[330] Luncurkan Program Kode Sumber File Tunggal Meningkatkan peluncur Java untuk meluncurkan program sebagai file tunggal dengan kode sumber Java Java sering dikritik karena sintaksisnya yang panjang dan "upacara" multi-langkah untuk meluncurkan aplikasi sepele sekalipun. Terkadang hal ini membuat takut para pemula. Untuk menulis aplikasi yang hanya mencetak " Hello World! " ", Anda perlu menulis kelas dengan voidmetode utama statis publik dan menggunakan metode System.out.println. Setelah melakukan ini, Anda harus mengkompilasi kode menggunakan javac . Terakhir, setelah ini, Anda dapat meluncurkan aplikasi, yang akan menampilkan salam naas (tentu saja, lingkungan pengembangan terintegrasi, baik IDEA maupun yang ada di dalam JavaRush , melakukan “keajaiban peluncuran aplikasi” ini sendiri - catatan editor ). Jujur saja: di sebagian besar bahasa pemrograman, skrip sebenarnya untuk menjalankan program terlihat jauh lebih sederhana. JEP 330 menghilangkan kebutuhan untuk mengkompilasi aplikasi file tunggal, jadi sekarang jika Anda menggunakan baris perintah, cukup ketik
java HelloWorld.java
Peluncur Java akan mendeteksi bahwa file tersebut berisi kode sumber Java dan mengkompilasi kode tersebut ke dalam file kelas sebelum mengeksekusinya. Anda dapat menempatkan parameter setelah atau sebelum nama file kode sumber. Yang ditempatkan setelah nama diteruskan sebagai parameter saat aplikasi dijalankan. Yang ditempatkan sebelum nama diteruskan sebagai parameter ke peluncur Java setelah kode dikompilasi. Opsi khusus kompiler (seperti classpath) juga akan diteruskan ke javac untuk kompilasi. Contoh. Garis:
java -classpath / home / foo / java Hello.java Bonjour
akan setara dengan baris ini:
javac -classpath / home / foo / java Hello.java
java -classpath / home / foo / java Hello Bonjour
[321] Klien HTTP (Standar) - Dukungan API Klien HTTP telah distandarisasi. JDK 9 memperkenalkan API baru untuk mendukung protokol Klien HTTP (JEP 110) . Sejak JDK 9 juga memperkenalkan Java Platform Module System (JPMS) , API ini disertakan sebagai modul inkubator (ini adalah modul untuk menyediakan API baru bagi pengembang yang belum menjadi standar di Java SE, sementara API "langsung" sedang digunakan. siap untuk dihapus - pengembang dapat mencoba API baru dan mencoba memberikan masukan). Setelah perubahan yang diperlukan dilakukan (API ini telah diperbarui di JDK 10), API dapat menjadi bagian dari standar. Jadi, HTTP Client API kini resmi disertakan di Java SE 11 . Ini memperkenalkan modul dan paket baru untuk JDK, java.net.http . Tipe baru yang utama adalah: HttpClient HttpRequest HttpResponse WebSocket API ini dapat digunakan secara sinkron atau asinkron. Dalam mode asinkron, CompletionFuturesdan digunakan CompletionStages. [320] Hapus Modul Java EE dan CORBA Dengan diperkenalkannya Java Platform Module System (JPMS) di Java versi kesembilan, menjadi mungkin untuk membagi file rt.jar monolitik menjadi beberapa modul. Selain itu, JPMS memungkinkan Anda membuat lingkungan runtime Java yang hanya menyertakan modul yang diperlukan oleh aplikasi Anda, sehingga sangat mengurangi ukurannya. Dengan batasan modul yang ditentukan secara transparan, jauh lebih mudah untuk menghapus bagian Java API yang sudah usang - itulah yang dilakukan JEP 320. Metamodul java.se.ee mencakup enam modul yang tidak akan menjadi bagian dari standar Java SE 11 dan tidak akan disertakan di JDK:
  • corba
  • transaksi
  • pengaktifan
  • xml.mengikat
  • xml.ws
  • xml.ws.anotasi
Modul-modul ini tidak digunakan lagi di JDK 9 dan tidak disertakan secara default dalam kompilasi atau eksekusi. Artinya, jika Anda mencoba mengkompilasi atau menjalankan aplikasi yang menggunakan API modul ini di JDK 9 atau JDK 10, maka gagal. Jika Anda menggunakan API modul ini dalam kode Anda, Anda harus menyediakannya sebagai modul atau pustaka terpisah.

API baru

Sejumlah besar API baru di JDK 11 muncul berkat penyertaan modul Klien HTTP dan Perekam Penerbangan dalam standar bahasa . Untuk daftar lengkap API, lihat perbandingan komprehensif berbagai versi JDK berikut , yang disusun oleh Gunnar Morling. Dan dalam catatan ini kami akan mencantumkan beberapa metode baru yang tidak termasuk dalam modul java.net.http , jdk.jfr dan java.security . java.lang.String Bisa dibilang salah satu perubahan terpenting pada String di JDK 11 API, ada beberapa metode baru yang berguna.
  • boolean isBlank (): mengembalikan nilai benar jika string kosong atau hanya berisi spasi, salah jika sebaliknya.

  • Stream lines(): Mengembalikan aliran garis yang diekstraksi dari string ini, dipisahkan oleh terminator garis.

  • String repeat (int): Mengembalikan string yang nilainya merupakan rangkaian string yang diulang berkali - kali.

  • String strip (): Mengembalikan string dengan semua spasi dihapus sebelum atau sesudah karakter non-spasi pertama.

  • String stripLeading (): Mengembalikan string dengan semua spasi hingga karakter non-spasi pertama dihapus.

  • String stripTrainling (): Mengembalikan string dengan semua spasi yang muncul setelah karakter non-spasi terakhir dihapus.
strip()Metode ini telah melakukan hal serupa trim (), tetapi berdasarkan spasi, metode ini memiliki arti yang berbeda. Dalam hal ini, trim()hanya spasi yang terpotong, dan dalam strip()- juga karakter khusus, misalnya tab. java.lang.StringBuffer java.lang.StringBuilder Kedua kelas ini berisi metode baru compareTo ()yang menerima StringBuffer/ StringBuilderdan mengembalikan int. Metode perbandingan leksikal mirip dengan metode baru compareTo() CharSequence. java.io.ByteArrayOutputStream
  • void writeBytes (byte []): menulis semua byte parameter ke aliran keluaran java.io.FileReader
Ada dua konstruktor baru di sini yang memungkinkan Anda menentukan Charset. java.io.FileWriter Empat konstruktor baru yang memungkinkan Anda menentukan Charset. java.io.InputStream
  • io.InputStream nullInputStream (): return InputStream, yang tidak membaca byte apa pun. Bagaimana cara menggunakan metode ini? Anda dapat menganggapnya seperti /dev/null membuang keluaran yang tidak Anda perlukan, atau memasukkan masukan yang selalu menghasilkan nol byte.
java.io.OutputStream
  • io.OutputStream nullOutputStream ()
java.io.Pembaca
  • io.Reader nullReader ()
java.io.Writer
  • io.Writer nullWriter ()
java.lang.Karakter
  • String toString (int): Ini merupakan kelebihan metode yang sudah ada, tetapi menggunakan int alih-alih char.
java.lang.CharSequence
  • int compare (CharSequence, CharSequence): secara leksikografis membandingkan dua contoh CharSequence. Mengembalikan nilai negatif, nol, atau nilai positif jika urutan pertama secara leksikografis lebih kecil, sama dengan, atau lebih besar dari urutan kedua.
java.lang.ref.Referensi
    lang.Object clone (): Penginjil Jawa, Simon Ritter, mengakui bahwa cara ini membingungkannya. Kelas Referencetidak mengimplementasikan antarmuka Cloneabledan metode ini akan selalu mengeluarkan pengecualian CloneNotSupportedException. Namun, para ahli berpendapat bahwa cara ini akan berguna untuk sesuatu di masa depan.
java.lang.Runtime java.lang.System Tidak ada metode baru di sini. Anggap saja metode tersebut runFinalizersOnExit ()telah dihapus dari kedua kelas ini, yang dapat menyebabkan masalah kompatibilitas. java.lang.Thread Tidak ada metode tambahan, kami hanya akan menyebutkan bahwa destroy ()metode tersebut stop (Throwable)telah dihapus. Namun stop (), yang tidak memerlukan argumen, masih tersedia. Harap diingat karena mungkin ada masalah kompatibilitas. java.nio.ByteBuffer java.nio.CharBuffer java.nio.DoubleBuffer java.nio.FloatBuffer java.nio.LongBuffer java.nio.ShortBuffer Di semua kelas ini, pengembang bahasa menambahkan metode mismatch ()yang menemukan dan mengembalikan indeks relatif dari ketidakcocokan pertama antara buffer ini dan buffer yang diberikan. java.nio.channels.SelectionKey
  • int interestOpsAnd (int)

  • int interestOpsOr (int)
java.nio.channels.Selector
  • int select (java.util.function.Consumer, long): Memilih dan menjalankan tindakan pada tombol yang saluran terkaitnya siap untuk operasi I/O. Parameter panjang adalah batas waktu.

  • int select (java.util.function.Consumer): berfungsi seperti metode di atas, tetapi tanpa batas waktu.

  • int selectNow (java.util.function.Consumer): berfungsi seperti cara di atas, hanya saja tidak memblokir.

java.nio.file.File
  • String readString (Path): Membaca semua konten dari file menjadi string, mendekode byte menjadi karakter menggunakan pengkodean UTF-8 .

  • String readString (Path, Charset): Bekerja seperti metode di atas, tetapi menerjemahkan byte menjadi karakter menggunakan Charset.

  • Path writeString (Path, CharSequence, java.nio.file. OpenOption []): Jika Anda menulis urutan karakter CharSequenceke file, karakter tersebut akan dikodekan ke dalam byte (menggunakan UTF-8 ).

  • Path writeString (Path, CharSequence, java.nio.file. Charset, OpenOption []): berfungsi seperti metode di atas, hanya karakter yang dikodekan ke dalam byte menggunakan Charset.
java.nio.file.Jalur
  • Path(String, String[]): Mengembalikan Path, mengubah pathstring atau rangkaian string yang bila digabungkan membentuk pathstring.

  • Path (net.URI): Mengembalikan jalur dengan mengubah URI.
java.util.Koleksi
  • Object [] toArray (java.util.function.IntFunction): Mengembalikan array yang berisi semua elemen dalam koleksi ini, menggunakan fungsi generator yang disediakan untuk mendistribusikan array yang dikembalikan.
java.util.bersamaan.PriorityBlockingQueue java.util.PriorityQueue
  • void forEach (java.util.function.Consumer): Melakukan tindakan yang ditentukan pada setiap elemen Iterable hingga semua elemen telah diproses atau tindakan tersebut memunculkan pengecualian.

  • boolean removeAll (java.util.Collection): Menghapus semua elemen koleksi ini yang juga terdapat dalam koleksi yang ditentukan (operasi opsional).

  • boolean removeIf (java.util.function.Predicate): Menghapus semua elemen koleksi ini yang memenuhi predikat yang diberikan.

  • boolean retainAll (java.util.Collection): Hanya mempertahankan elemen dalam koleksi ini yang terdapat dalam koleksi yang ditentukan (operasi opsional).
java.util.bersamaan.TimeUnit
  • long convert (java.time.Duration): Mengonversi durasi waktu tertentu ke satuan ini.
java.util.fungsi.Predikat
  • Predicate not(Predicate): mengembalikan predikat yang merupakan negasi dari predikat yang diberikan.
Misalnya kode berikut:
lines.stream ()

.filter (s ->! s.isBlank ())
dapat dikonversi menjadi ini:
lines.stream ()

.filter (Predicate.not (String :: ISBLANK))
dan jika kita menggunakan impor statis, inilah yang kita dapatkan:
lines.stream ()
.filter (not(String :: ISBLANK))
java.util.Opsional java.util.OptionalInt java.util.OptionalDouble java.util.OptionalLong
  • boolean isEmpty (): Mengembalikan nilai benar jika tidak ada nilai , salah jika tidak .
java.util.regex.Pattern
  • Predicate asMatchPredicate (): Pakar Java Simon Ritter percaya mungkin ada permata API JDK 11 asli yang tersembunyi di sini Metode ini menciptakan predikat yang memeriksa apakah pola ini cocok dengan string masukan yang diberikan.
java.util.zip.Deflater
  • int deflate (ByteBuffer): Mengompresi data masukan dan mengisi buffer yang ditentukan dengan data terkompresi.

  • int deflate (ByteBuffer, int): Mengompresi data masukan dan mengisi buffer yang ditentukan dengan data terkompresi. Mengembalikan jumlah sebenarnya dari data terkompresi.

  • void setDictionary (ByteBuffer): Menyetel kamus tertentu untuk dikompresi menjadi byte dalam buffer tertentu. Ini adalah kelebihan metode yang sudah ada yang sekarang dapat menerima array ByteBuffer, bukan array byte.

  • void setInput (ByteBuffer): Mengatur data masukan yang akan dikompresi. Ini juga merupakan kelebihan dari metode yang sudah ada.
java.util.zip.Inflater
  • int inflate (ByteBuffer): Membongkar byte ke dalam buffer yang ditentukan. Mengembalikan jumlah aktual byte yang tidak terkompresi.

  • void setDictionary (ByteBuffer): Menyetel kamus tertentu ke byte dalam buffer tertentu. Merupakan bentuk kelebihan beban dari metode yang sudah ada.

  • void setInput (ByteBuffer): Mengatur data input untuk dekompresi. Bentuk kelebihan beban dari metode yang sudah ada.
javax.print.attribute.standard.DialogOwner Ini adalah kelas baru di JDK 11 dan merupakan kelas atribut yang digunakan untuk mendukung permintaan halaman pencetakan atau penyesuaian untuk ditampilkan di atas semua jendela atau jendela tertentu. javax.swing.DefaultComboBoxModel javax.swing.DefaultListModel
  • void addAll (Collection): Menambahkan semua elemen yang ada dalam koleksi.

  • void addAll (int, Collection): Menambahkan semua elemen yang ada dalam koleksi, dimulai dari indeks yang ditentukan.
javax.ayunan.ListSelectionModel
  • int [] getSelectedIndices (): Mengembalikan array dari semua indeks yang dipilih dalam model yang dipilih dalam urutan menaik.

  • int getSelectedItemsCount (): Mengembalikan jumlah item yang dipilih.
jdk.jshell.EvalException
  • shell.JShellException getCause (): Mengembalikan alasan yang dapat dibuang di klien eksekusi yang disajikan oleh EvalException ini, atau null jika alasannya tidak ada atau tidak diketahui.

Fitur non-pengembang Java 11

[181] Kontrol Akses Berbasis Nest Java dan bahasa lainnya mendukung kelas bersarang melalui kelas dalam. Agar ini berfungsi, kompiler harus melakukan trik tertentu. Misalnya:
public class Outer {
    private int outerInt;

     class Inner {
       public void printOuterInt() {
         System.out.println("Outer int = " + outerInt);
       }
     }
   }
Kompiler memodifikasi ini untuk menghasilkan sesuatu seperti berikut sebelum dikompilasi:
public class Outer {
      private int outerInt;

      public int access$000() {
        return outerInt;
      }

    }


    class Inner$Outer {

      Outer outer;

      public void printOuterInt() {
        System.out.println("Outer int = " + outer.access$000());
      }
    }
Meskipun secara logis kelas dalam adalah bagian dari kode yang sama dengan kelas luar, namun dikompilasi sebagai kelas terpisah. Oleh karena itu, operasi ini memerlukan metode gabungan sintetis yang harus dibuat oleh kompiler untuk menyediakan akses ke bidang privat kelas luar. JEP ini memperkenalkan konsep sarang, dimana dua anggota sarang yang sama (Luar dan Dalam dalam contoh kita) adalah teman bersarang. Dua atribut baru ditentukan untuk format file kelas: NestHost dan NestMembers . Perubahan ini berguna untuk bahasa lain yang mendukung kelas bersarang dan bytecode. Fungsi ini memperkenalkan tiga metode baru untuk java.lang.Class : Kelas getNestHost () Kelas [] getNestMembers () boolean isNestmateOf (Kelas) [309] Konstanta File Kelas Dinamis JEP ini menjelaskan ekstensi ke format file kelas untuk mendukung yang baru bentuk kumpulan persisten CONSTANT_Dynamic. Gagasan tentang konstanta dinamis tampak seperti sebuah oxymoron, tetapi pada dasarnya Anda dapat menganggapnya sebagai nilai akhir di Java 11. Nilai konstanta penyatuan tidak disetel pada waktu kompilasi (tidak seperti konstanta lainnya), tetapi menggunakan bootstrap metode untuk menentukan nilai pada waktu tunggu. Oleh karena itu, nilainya bersifat dinamis, tetapi karena nilainya hanya ditetapkan satu kali, maka nilainya juga konstan. Fitur ini terutama ditujukan untuk orang-orang yang mengembangkan bahasa dan kompiler baru yang akan menghasilkan bytecode dan file kelas sebagai output untuk dijalankan di JVM. [315] Tingkatkan Intrinsik Aarch64 JEP ini diusulkan oleh komunitas Red Hat. JVM sekarang dapat menggunakan instruksi yang lebih khusus yang tersedia di set instruksi Arm 64. Secara khusus, ini meningkatkan kinerja, metode sin (), dan cos ()kelas java.lang.Math . [318] Epsilon: Pengumpul Sampah Tanpa Operasi Seperti halnya JEP 315 , Anda dapat berterima kasih kepada Red Hat atas pengenalan pengumpul sampah Epsilon. Epsilon tidak biasa karena sebenarnya tidak mengumpulkan sampah! Saat membuat objek baru, ia mengalokasikan memori jika diperlukan, namun tidak mengambil kembali ruang yang ditempati oleh objek yang tidak terdaftar. " Apa gunanya? ", - Anda bertanya. Ternyata “pengumpulan sampah” ini memiliki dua kegunaan: log ()
  1. Pertama-tama, pengumpul sampah ini dirancang untuk memastikan bahwa algoritma GC baru dievaluasi dalam hal dampak kinerjanya. Idenya adalah menjalankan aplikasi sampel dengan Epsilon dan menghasilkan sekumpulan metrik. Algoritme pengumpulan sampah baru diaktifkan, pengujian yang sama dijalankan, lalu hasilnya dibandingkan.

  2. Untuk tugas yang sangat singkat (pikirkan fungsi tanpa server di cloud) yang dapat Anda jamin tidak akan melebihi memori yang dialokasikan ke heap. Hal ini dapat meningkatkan kinerja dengan menghilangkan overhead (termasuk pengumpulan statistik yang diperlukan untuk memutuskan apakah akan menjalankan kolektor) dalam kode aplikasi. Jika ruang heap habis, JVM mungkin salah dikonfigurasi dengan salah satu dari tiga cara berikut:
    • Biasa disebut OutOfMemoryError.
    • Lakukan pengaturan ulang tumpukan
    • Hard drive JVM gagal dan mungkin melakukan tugas lain (seperti memulai debugger).
[328]: Perekam Penerbangan Perekam Penerbangan adalah kerangka akuisisi data tingkat rendah untuk JVM. Sebelum JDK 11, ini adalah fitur komersial dalam biner Oracle JDK. Oracle kini menghilangkan perbedaan fungsional antara Oracle JDK dan build dari OpenJDK. Inilah yang dilakukan Perekam Penerbangan :
  • Menyediakan API untuk memproduksi dan menggunakan data sebagai peristiwa
  • Menyediakan mekanisme buffer dan format data biner
  • Memungkinkan penyesuaian dan pemfilteran acara
  • Menyediakan acara untuk perpustakaan OS, JVM HotSpot dan JDK
Ada dua modul baru di sini: jdk.jfr dan jdk.management.jfr . [329] Algoritma kriptografi ChaCha20 dan Poly1305 JEP ini tentang memperbarui sandi yang digunakan oleh JDK. Kasus ini mengimplementasikan algoritma enkripsi ChaCha20 dan ChaCha20-Poly1305 seperti yang ditentukan dalam RFC 7539. ChaCha20 adalah stream cipher yang relatif baru yang dapat menggantikan cipher RC4 lama yang tidak aman . [333] ZGC: Pengumpul Sampah Latensi Rendah yang Dapat Diskalakan Sebuah pengumpul sampah eksperimental dengan latensi rendah yang dapat diskalakan. Dirancang untuk digunakan dengan aplikasi yang memerlukan heap besar (multigigabyte) dan latensi rendah. Ia menggunakan tumpukan generasi tunggal dan melakukan sebagian besar (tetapi tidak semua) pekerjaan pengumpulan sampah pada saat yang sama dengan aplikasi. [332] Transport Layer Security (TLS) 1.3 TLS 1.3 (RFC 8446) adalah patch utama pada protokol keamanan lapisan transport TLS yang memberikan peningkatan keamanan dan kinerja yang signifikan dibandingkan versi sebelumnya. JDK sekarang mendukung versi protokol ini. 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