JavaRush /Blog Java /Random-MS /Java 11 dikeluarkan: ciri dan keupayaan baharu

Java 11 dikeluarkan: ciri dan keupayaan baharu

Diterbitkan dalam kumpulan
Sebelum ini, versi baharu Java jarang muncul dan dengan kelewatan. Kini Oracle berjaya mengekalkan irama yang ditetapkan sendiri "Java baharu setiap enam bulan." Jadi beberapa hari lalu, mengikut jadual, kami akhirnya menerima Java SE 11 dan pelaksanaan JDK (Java Development Kit). Java 11 dikeluarkan: ciri dan keupayaan baharu - 1Seperti biasa, versi baharu akan serasi dengan versi lama dan sokongan untuk Java 11 akan tamat tidak lebih awal daripada Disember 2026.

Ciri baharu dalam Java SE 11 (kelihatan kepada pembangun)

Ingat bahawa di Jawa, perubahan dibuat melalui pelaksanaan JEP "Cadangan Peningkatan JDK". JEP ialah cadangan untuk menambah baik OpenJDK dan mungkin diluluskan, ditangguhkan atau ditolak. Iaitu, pada dasarnya, koleksi JEP adalah strategi pembangunan untuk OpenJDK. Dalam kurungan persegi sebelum "ciri" baharu kami akan menunjukkan nombor JEP yang sepadan. [323] Sintaks Pembolehubah Setempat untuk Parameter Lambda - sintaks var untuk parameter lambda Java 10 memperkenalkan kata kunci var, yang memungkinkan untuk tidak menyatakan secara eksplisit jenis pembolehubah tempatan. Ini memudahkan kod. JEP 323 mengembangkan penggunaan sintaks ini dengan ungkapan lambda. Contoh mudah:
list.stream ()
                 .map ((var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
Seperti yang ditulis oleh Simon Ritter , seorang penginjil Java yang terkenal, seorang pengaturcara Java yang berpengalaman akan menyedari bahawa penggunaan var dalam kes ini mungkin tidak diperlukan, kerana kod di atas boleh digantikan dengan yang berikut:
list.stream ()
                  .map (s -> s.toLowerCase ())
                  .collect (Collectors.toList ());
Mengapa, kemudian, menyokong var? Terdapat hanya satu kes khas - apabila anda ingin menambah anotasi pada parameter lambda. Ini tidak boleh dilakukan tanpa beberapa jenis yang terlibat, dan untuk mengelakkan daripada menggunakan jenis eksplisit, kami boleh memudahkan segala-galanya menggunakan var seperti ini:
list.stream ()
                 .map ((@ Notnull var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
[330] Lancarkan Program Kod Sumber Fail Tunggal Meningkatkan pelancar Java untuk melancarkan program sebagai satu fail dengan kod sumber Java Java sering dikritik kerana sintaks verbose dan "upacara" berbilang langkah untuk melancarkan aplikasi walaupun remeh. Kadang-kadang ini menakutkan orang baru. Untuk menulis aplikasi yang hanya mencetak " Hello World! " ", anda perlu menulis kelas dengan voidkaedah utama statik awam dan menggunakan System.out.println. Setelah melakukan ini, anda mesti menyusun kod menggunakan javac . Akhirnya, selepas ini, anda boleh melancarkan aplikasi, yang akan memaparkan ucapan malang (sudah tentu, persekitaran pembangunan bersepadu, kedua-dua IDEA dan yang dibina ke dalam JavaRush , melakukan "sihir pelancaran aplikasi" ini sendiri - nota editor ). Sejujurnya: dalam kebanyakan bahasa pengaturcaraan, skrip sebenar untuk menjalankan program kelihatan lebih mudah. JEP 330 menghapuskan keperluan untuk menyusun aplikasi satu fail, jadi sekarang jika anda menggunakan baris arahan, taip sahaja
java HelloWorld.java
Pelancar Java akan mengesan bahawa fail tersebut mengandungi kod sumber Java dan menyusun kod tersebut ke dalam fail kelas sebelum melaksanakannya. Anda boleh meletakkan parameter selepas atau sebelum nama fail kod sumber. Mereka yang diletakkan selepas nama diluluskan sebagai parameter apabila aplikasi dilaksanakan. Mereka yang diletakkan sebelum nama dihantar sebagai parameter kepada pelancar Java selepas kod disusun. Pilihan khusus pengkompil (seperti classpath) juga akan dihantar ke javac untuk penyusunan. Contoh. Talian:
java -classpath / home / foo / java Hello.java Bonjour
akan bersamaan dengan baris ini:
javac -classpath / home / foo / java Hello.java
java -classpath / home / foo / java Hello Bonjour
[321] Klien HTTP (Standard) - Sokongan API Klien HTTP telah diseragamkan. JDK 9 memperkenalkan API baharu untuk menyokong protokol Klien HTTP (JEP 110) . Memandangkan JDK 9 turut memperkenalkan Java Platform Module System (JPMS) , API ini disertakan sebagai modul inkubator (ini adalah modul untuk menyediakan pembangun API baharu yang belum lagi menjadi standard dalam Java SE, manakala API "langsung" sedang disediakan untuk dialih keluar - pembangun boleh mencuba API baharu dan cuba memberikan maklum balas). Setelah perubahan yang diperlukan dibuat (API ini telah dikemas kini dalam JDK 10), API boleh menjadi sebahagian daripada standard. Jadi, API Klien HTTP kini disertakan secara rasmi dalam Java SE 11 . Ini memperkenalkan modul dan pakej baharu untuk JDK, java.net.http . Jenis baharu yang utama ialah: HttpClient HttpRequest HttpResponse WebSocket API ini boleh digunakan secara serentak atau tak segerak. Dalam mod tak segerak, CompletionFuturesdan digunakan CompletionStages. [320] Keluarkan Modul Java EE dan CORBA Dengan pengenalan Sistem Modul Platform Java (JPMS) dalam versi kesembilan Java, ia menjadi mungkin untuk membahagikan fail rt.jar monolitik kepada beberapa modul. Di samping itu, JPMS membolehkan anda mencipta persekitaran masa jalan Java yang merangkumi hanya modul yang diperlukan oleh aplikasi anda, dengan sangat mengurangkan saiznya. Dengan sempadan modul yang ditakrifkan secara telus, lebih mudah untuk mengalih keluar bahagian Java API yang usang - itulah yang dilakukan oleh JEP 320. Metamodule java.se.ee merangkumi enam modul yang tidak akan menjadi sebahagian daripada standard Java SE 11 dan tidak akan disertakan dalam JDK:
  • corba
  • transaksi
  • pengaktifan
  • xml.bind
  • xml.ws
  • xml.ws.anotasi
Modul ini telah ditamatkan dalam JDK 9 dan tidak disertakan secara lalai dalam penyusunan atau pelaksanaan. Ini bermakna jika anda cuba menyusun atau menjalankan aplikasi yang menggunakan API modul ini pada JDK 9 atau JDK 10, ia gagal. Jika anda menggunakan API modul ini dalam kod anda, anda perlu menyediakannya sebagai modul atau pustaka yang berasingan.

API baharu

Sebilangan besar API baharu dalam JDK 11 muncul berkat kemasukan Klien HTTP dan modul Perakam Penerbangan dalam standard bahasa . Untuk senarai lengkap API, lihat perbandingan komprehensif berikut bagi versi berbeza JDK , yang disusun oleh Gunnar Morling. Dan dalam nota ini kami akan menyenaraikan beberapa kaedah baharu yang tidak termasuk dalam modul java.net.http , jdk.jfr dan java.security . java.lang.String Boleh dikatakan salah satu perubahan terpenting pada String dalam JDK 11 API, terdapat beberapa kaedah baharu yang berguna.
  • boolean isBlank (): mengembalikan benar jika rentetan kosong atau mengandungi hanya ruang, palsu sebaliknya.

  • Stream lines(): Mengembalikan aliran baris yang diekstrak daripada rentetan ini, dipisahkan oleh penamat baris.

  • String repeat (int): Mengembalikan rentetan yang nilainya ialah gabungan rentetan itu berulang kali int .

  • String strip (): Mengembalikan rentetan dengan semua ruang dialih keluar sebelum atau selepas aksara bukan ruang pertama.

  • String stripLeading (): Mengembalikan rentetan dengan semua ruang sehingga aksara bukan ruang pertama dialih keluar.

  • String stripTrainling (): Mengembalikan rentetan dengan semua ruang yang berlaku selepas aksara bukan ruang terakhir dialih keluar.
strip()Kaedah ini telah melakukan sesuatu yang serupa trim (), tetapi mengikut ruang kaedah ini bermakna perkara yang berbeza. Sekiranya, trim()hanya ruang dipotong, dan dalam strip()- juga aksara khas, seperti tab. java.lang.StringBuffer java.lang.StringBuilder Kedua-dua kelas ini mengandungi kaedah baharu compareTo ()yang menerima StringBuffer/ StringBuilderdan mengembalikan int. Kaedah perbandingan leksikal adalah serupa dengan kaedah baru compareTo() CharSequence. java.io.ByteArrayOutputStream
  • void writeBytes (byte []): menulis semua bait parameter ke strim output java.io.FileReader
Terdapat dua pembina baharu di sini yang membolehkan anda menentukan Charset. java.io.FileWriter Empat pembina baharu yang membolehkan anda menentukan Charset. java.io.InputStream
  • io.InputStream nullInputStream (): returns InputStream, yang tidak membaca sebarang bait. Bagaimana untuk menggunakan kaedah ini? Anda boleh menganggapnya sebagai sesuatu seperti /dev/null untuk membuang output yang anda tidak perlukan, atau untuk menyuntik input yang sentiasa mengembalikan bait sifar.
java.io.OutputStream
  • io.OutputStream nullOutputStream ()
java.io.Reader
  • io.Reader nullReader ()
java.io.Writer
  • io.Writer nullWriter ()
java.lang.Character
  • String toString (int): Ini adalah lebihan kaedah sedia ada, tetapi menggunakan int dan bukannya char.
java.lang.CharSequence
  • int compare (CharSequence, CharSequence): membandingkan dua contoh secara leksikografi CharSequence. Mengembalikan nilai negatif, sifar, atau nilai positif jika urutan pertama secara leksikografi kurang daripada, sama dengan, atau lebih besar daripada yang kedua, masing-masing.
java.lang.ref.Reference
    lang.Object clone (): Penginjil Java Simon Ritter mengakui bahawa kaedah ini mengelirukan dia. Kelas Referencetidak melaksanakan antara muka Cloneabledan kaedah ini akan sentiasa membuang pengecualian CloneNotSupportedException. Walau bagaimanapun, pakar mencadangkan bahawa kaedah ini akan berguna untuk sesuatu pada masa hadapan.
java.lang.Runtime java.lang.System Tiada kaedah baharu di sini. Sebut sahaja kaedah itu runFinalizersOnExit ()telah dialih keluar daripada kedua-dua kelas ini, yang mungkin menyebabkan masalah keserasian. java.lang.Thread Tiada kaedah tambahan, kami hanya akan menyebut bahawa destroy ()kaedah tersebut stop (Throwable)telah dialih keluar. Walau bagaimanapun stop (), yang tidak memerlukan hujah, masih tersedia. Sila ingat perkara ini kerana mungkin terdapat masalah keserasian. java.nio.ByteBuffer java.nio.CharBuffer java.nio.DoubleBuffer java.nio.FloatBuffer java.nio.LongBuffer java.nio.ShortBuffer Dalam semua kelas ini, pembangun bahasa menambah kaedah mismatch ()yang mencari dan mengembalikan indeks relatif bagi ketidakpadanan pertama antara penimbal ini dan penimbal 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 melaksanakan tindakan pada kekunci yang saluran sepadannya sedia untuk operasi I/O. Parameter panjang ialah tamat masa.

  • int select (java.util.function.Consumer): berfungsi seperti kaedah di atas, tetapi tanpa tamat masa.

  • int selectNow (java.util.function.Consumer): berfungsi seperti kaedah di atas, cuma ia tidak menyekat.

java.nio.file.Files
  • String readString (Path): Membaca semua kandungan daripada fail ke dalam rentetan, menyahkod bait kepada aksara menggunakan pengekodan UTF-8 .

  • String readString (Path, Charset): Berfungsi seperti kaedah di atas, tetapi menyahkod bait kepada aksara menggunakan Charset.

  • Path writeString (Path, CharSequence, java.nio.file. OpenOption []): Jika anda menulis urutan aksara CharSequencepada fail, aksara tersebut akan dikodkan ke dalam bait (menggunakan UTF-8 ).

  • Path writeString (Path, CharSequence, java.nio.file. Charset, OpenOption []): berfungsi seperti kaedah di atas, hanya aksara yang dikodkan ke dalam bait menggunakan Charset.
java.nio.file.Path
  • Path(String, String[]): Mengembalikan Path, mengubah rentetan laluan atau urutan rentetan yang apabila digabungkan membentuk rentetan laluan.

  • Laluan (net.URI): Mengembalikan laluan dengan mengubah URI.
java.util.Collection
  • Object [] toArray (java.util.function.IntFunction): Mengembalikan tatasusunan yang mengandungi semua elemen dalam koleksi ini, menggunakan fungsi penjana yang disediakan untuk mengedarkan tatasusunan yang dikembalikan.
java.util.concurrent.PriorityBlockingQueue java.util.PriorityQueue
  • void forEach (java.util.function.Consumer): Melakukan tindakan yang ditentukan pada setiap elemen Boleh Diterbalikkan sehingga semua elemen telah diproses atau tindakan itu membuang pengecualian.

  • boolean removeAll (java.util.Collection): Mengalih keluar semua elemen koleksi ini yang juga terkandung dalam koleksi yang ditentukan (operasi pilihan).

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

  • boolean retainAll (java.util.Collection): Mengekalkan hanya elemen dalam koleksi ini yang terkandung dalam koleksi yang ditentukan (operasi pilihan).
java.util.concurrent.TimeUnit
  • long convert (java.time.Duration): Menukarkan tempoh masa yang diberikan kepada unit ini.
java.util.function.Predicate
  • Predicate not(Predicate): mengembalikan predikat yang merupakan penolakan predikat yang diberikan.
Sebagai contoh, kod berikut:
lines.stream ()

.filter (s ->! s.isBlank ())
boleh ditukar kepada ini:
lines.stream ()

.filter (Predicate.not (String :: ISBLANK))
dan jika kita menggunakan import statik, maka inilah yang kita dapat:
lines.stream ()
.filter (not(String :: ISBLANK))
java.util.Optional java.util.OptionalInt java.util.OptionalDouble java.util.OptionalLong
  • boolean isEmpty (): Mengembalikan benar jika tiada nilai , sebaliknya palsu .
java.util.regex.Corak
  • Predicate asMatchPredicate (): Pakar Java Simon Ritter percaya mungkin terdapat permata API JDK 11 sebenar yang tersembunyi di sini. Kaedah ini mencipta predikat yang menyemak sama ada corak ini sepadan dengan rentetan input yang diberikan.
java.util.zip.Deflater
  • int deflate (ByteBuffer): Memampatkan data input dan mengisi penimbal yang ditentukan dengan data termampat.

  • int deflate (ByteBuffer, int): Memampatkan data input dan mengisi penimbal yang ditentukan dengan data termampat. Mengembalikan jumlah sebenar data termampat.

  • void setDictionary (ByteBuffer): Menetapkan kamus yang diberikan untuk dimampatkan ke dalam bait dalam penimbal yang diberikan. Ini adalah lebihan kaedah sedia ada yang kini boleh menerima ByteBuffertatasusunan bait dan bukannya bait.

  • void setInput (ByteBuffer): Menetapkan data input untuk dimampatkan. Ia juga merupakan kelebihan kaedah sedia ada.
java.util.zip.Inflater
  • int inflate (ByteBuffer): Membongkar bait ke dalam penimbal yang ditentukan. Mengembalikan bilangan sebenar bait yang tidak dimampatkan.

  • void setDictionary (ByteBuffer): Menetapkan kamus yang diberikan kepada bait dalam penimbal yang diberikan. Merupakan bentuk terlebih beban bagi kaedah sedia ada.

  • void setInput (ByteBuffer): Menetapkan data input untuk penyahmampatan. Bentuk terlebih beban kaedah sedia ada.
javax.print.attribute.standard.DialogOwner Ini ialah kelas baharu dalam JDK 11 dan merupakan kelas atribut yang digunakan untuk menyokong permintaan halaman cetakan atau penyesuaian untuk dipaparkan di atas semua tetingkap atau tetingkap tertentu. javax.swing.DefaultComboBoxModel javax.swing.DefaultListModel
  • void addAll (Collection): Menambah semua elemen yang terdapat dalam koleksi.

  • void addAll (int, Collection): Menambah semua elemen yang terdapat dalam koleksi, bermula pada indeks yang ditentukan.
javax.swing.ListSelectionModel
  • int [] getSelectedIndices (): Mengembalikan tatasusunan semua indeks yang dipilih dalam model yang dipilih dalam tertib menaik.

  • int getSelectedItemsCount (): Mengembalikan bilangan item yang dipilih.
jdk.jshell.EvalException
  • shell.JShellException getCause (): Mengembalikan sebab boleh lempar dalam klien pelaksanaan yang dikemukakan oleh EvalException ini, atau batal jika sebab itu tidak wujud atau tidak diketahui.

Ciri bukan pembangun Java 11

[181] Kawalan Akses Berasaskan Nest Java dan bahasa lain menyokong kelas bersarang melalui kelas dalaman. Untuk ini berfungsi, pengkompil mesti melakukan helah tertentu. Sebagai contoh:
public class Outer {
    private int outerInt;

     class Inner {
       public void printOuterInt() {
         System.out.println("Outer int = " + outerInt);
       }
     }
   }
Pengkompil mengubah suai ini untuk menghasilkan sesuatu seperti berikut sebelum menyusun:
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());
      }
    }
Walaupun secara logiknya kelas dalam adalah sebahagian daripada kod yang sama dengan kelas luar, ia disusun sebagai kelas berasingan. Oleh itu, operasi ini memerlukan kaedah gabungan sintetik yang mesti dibuat oleh pengkompil untuk menyediakan akses kepada medan peribadi kelas luar. JEP ini memperkenalkan konsep sarang, di mana dua ahli sarang yang sama (Outer dan Inner dalam contoh kita) adalah teman bersarang. Dua atribut baharu ditakrifkan untuk format fail kelas: NestHost dan NestMembers . Perubahan ini berguna untuk bahasa lain yang menyokong kelas bersarang dan bytecode. Fungsi ini memperkenalkan tiga kaedah baharu untuk java.lang.Class : Kelas getNestHost () Kelas [] getNestMembers () boolean isNestmateOf (Kelas) [309] Pemalar Kelas-Fail Dinamik JEP ini menerangkan pelanjutan kepada format fail kelas untuk menyokong yang baharu bentuk kolam berterusan CONSTANT_Dynamic. Idea pemalar dinamik kelihatan seperti oksimoron, tetapi pada asasnya anda boleh menganggapnya sebagai nilai akhir dalam Java 11. Nilai pemalar penggabungan tidak ditetapkan pada masa penyusunan (tidak seperti pemalar lain), tetapi menggunakan bootstrap kaedah untuk menentukan nilai pada masa utama. Oleh itu nilai adalah dinamik, tetapi kerana nilainya ditetapkan sekali sahaja, ia juga malar. Ciri ini ditujukan terutamanya kepada orang yang membangunkan bahasa dan penyusun baharu yang akan menjana kod bait dan fail kelas sebagai output untuk dijalankan pada JVM. [315] Tingkatkan Aarch64 Intrinsik JEP ini dicadangkan oleh komuniti Red Hat. JVM kini boleh menggunakan lebih banyak arahan khusus yang tersedia dalam set arahan Arm 64. Khususnya , ini meningkatkan prestasi , kaedah sin ()dan cos ()kelas java.lang.Math . [318] Epsilon: Pengumpul Sampah Tanpa Operasi Seperti JEP 315 , anda boleh berterima kasih kepada Red Hat kerana memperkenalkan pemungut sampah Epsilon. Epsilon adalah luar biasa kerana ia sebenarnya tidak mengumpul sampah! Apabila mencipta objek baharu, ia memperuntukkan memori jika perlu, tetapi tidak menuntut semula ruang yang diduduki oleh objek tidak berdaftar. " Apa gunanya? ", - anda bertanya. Ternyata "pengumpulan sampah" ini mempunyai dua kegunaan: log ()
  1. Pertama sekali, pengumpul sampah ini direka untuk memastikan algoritma GC baharu dinilai dari segi impak prestasinya. Ideanya adalah untuk menjalankan aplikasi sampel dengan Epsilon dan menjana satu set metrik. Algoritma kutipan sampah baharu didayakan, ujian yang sama dijalankan, dan kemudian hasilnya dibandingkan.

  2. Untuk tugasan yang sangat singkat (fikirkan fungsi tanpa pelayan dalam awan) di mana anda boleh menjamin anda tidak akan melebihi memori yang diperuntukkan kepada timbunan. Ini boleh meningkatkan prestasi dengan menghapuskan overhed (termasuk mengumpul statistik yang diperlukan untuk memutuskan sama ada untuk menjalankan pengumpul) dalam kod aplikasi. Jika ruang timbunan kehabisan, JVM mungkin tersalah konfigurasi dalam salah satu daripada tiga cara:
    • Biasa dipanggil OutOfMemoryError.
    • Lakukan tetapan semula timbunan
    • Pemacu keras JVM telah gagal dan mungkin menjalankan tugas lain (seperti memulakan penyahpepijat).
[328]: Perakam Penerbangan Perakam Penerbangan ialah rangka kerja pemerolehan data peringkat rendah untuk JVM. Sebelum JDK 11, ini adalah ciri komersial dalam binari Oracle JDK. Oracle kini menghapuskan perbezaan fungsi antara Oracle JDK dan satu binaan daripada OpenJDK. Inilah yang dilakukan oleh Perakam Penerbangan :
  • Menyediakan API untuk menghasilkan dan menggunakan data sebagai peristiwa
  • Menyediakan mekanisme penimbal dan format data binari
  • Membenarkan penyesuaian dan penapisan acara
  • Menyediakan acara untuk perpustakaan OS, JVM HotSpot dan JDK
Terdapat dua modul baharu di sini: jdk.jfr dan jdk.management.jfr . [329] Algoritma kriptografi ChaCha20 dan Poly1305 JEP ini adalah mengenai mengemas kini sifir yang digunakan oleh JDK. Kes ini melaksanakan algoritma penyulitan ChaCha20 dan ChaCha20-Poly1305 seperti yang dinyatakan dalam RFC 7539. ChaCha20 ialah sifir strim yang agak baharu yang boleh menggantikan sifir RC4 yang lebih lama dan tidak selamat . [333] ZGC: Pengumpul Sampah Kependaman Rendah Boleh Skala Pengumpul sampah kependaman rendah boleh skala eksperimen. Direka bentuk untuk digunakan dengan aplikasi yang memerlukan timbunan besar (multigigabait) dan kependaman rendah. Ia menggunakan timbunan generasi tunggal dan melakukan kebanyakan (tetapi tidak semua) kerja pengumpulan sampah pada masa yang sama dengan aplikasi. [332] Keselamatan Lapisan Pengangkutan (TLS) 1.3 TLS 1.3 (RFC 8446) ialah tampung utama kepada protokol keselamatan lapisan pengangkutan TLS yang menyediakan peningkatan keselamatan dan prestasi yang ketara berbanding versi sebelumnya. JDK kini menyokong versi protokol ini. Bahan ini berdasarkan artikel oleh Simon Ritter dan dokumentasi rasmi .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION