JavaRush /Blog Jawa /Random-JV /Java 11 dirilis: fitur lan kabisan anyar

Java 11 dirilis: fitur lan kabisan anyar

Diterbitake ing grup
Sadurungé, vèrsi anyar Jawa arang katon lan ana wektu tundha. Saiki Oracle sukses njaga irama "Jawa anyar saben nem sasi." Dadi sawetara dina kepungkur, kanthi jadwal, pungkasane nampa Java SE 11 lan implementasine JDK (Java Development Kit). Java 11 dirilis: fitur lan kemampuan anyar - 1Kaya biasane, versi anyar bakal kompatibel karo sing lawas, lan dhukungan kanggo Java 11 bakal rampung ora luwih awal saka Desember 2026.

Fitur anyar ing Java SE 11 (katon kanggo pangembang)

Elinga yen ing Jawa, owah-owahan ditindakake liwat implementasi JEP "Proposal Peningkatan JDK". JEP minangka proposal kanggo nambah OpenJDK lan bisa disetujoni, ditundha, utawa ditolak. Sing, ing intine, koleksi JEP minangka strategi pangembangan kanggo OpenJDK. Ing kurung kothak sadurunge "fitur" anyar kita bakal nuduhake nomer JEP sing cocog. [323] Sintaksis Variabel Lokal kanggo Parameter Lambda - sintaks var kanggo paramèter lambda Java 10 ngenalaken tembung kunci var, sing ndadekake ora bisa nemtokake kanthi jelas jinis variabel lokal. Iki nyederhanakake kode. JEP 323 ngembangake panggunaan sintaks iki kanthi ekspresi lambda. Tuladha prasaja:
list.stream ()
                 .map ((var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
Kaya sing ditulis Simon Ritter , penginjil Jawa sing kondhang, programer Jawa sing berpengalaman bakal nyathet yen nggunakake var ing kasus iki bisa uga ora perlu, amarga kode ing ndhuwur bisa diganti karo:
list.stream ()
                  .map (s -> s.toLowerCase ())
                  .collect (Collectors.toList ());
Apa, banjur, ndhukung var? Mung ana siji kasus khusus - yen sampeyan pengin nambah anotasi menyang parameter lambda. Iki ora bisa ditindakake tanpa sawetara jinis, lan supaya ora nggunakake jinis eksplisit, kita bisa nyederhanakake kabeh nggunakake var kaya iki:
list.stream ()
                 .map ((@ Notnull var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
[330] Bukak Program Source-Code File Tunggal Nambahake launcher Java kanggo miwiti program minangka file siji karo kode sumber Jawa asring dikritik amarga sintaksis verbose lan "upacara" multi-langkah ngluncurake aplikasi sing ora pati penting. Kadhangkala iki wedi karo wong anyar. Kanggo nulis aplikasi sing mung nyithak " Hello World! " ", sampeyan kudu nulis kelas kanthi voidmetode utama statis umum lan nggunakake System.out.println. Sawise rampung iki, sampeyan kudu ngumpulake kode nggunakake javac . Pungkasan, sawise iki, sampeyan bisa miwiti aplikasi, sing bakal nampilake ucapan sing ora becik (mesthi lingkungan pangembangan terintegrasi, loro IDEA lan sing dibangun ing JavaRush , nindakake "sihir peluncuran aplikasi" iki dhewe - cathetan editor ). Jujur: ing pirang-pirang basa pemrograman, skrip nyata kanggo program sing mlaku katon luwih gampang. JEP 330 ngilangi kabutuhan kanggo ngumpulake aplikasi siji-file, mula saiki yen sampeyan nggunakake baris perintah, ketik wae.
java HelloWorld.java
Peluncur Java bakal ndeteksi manawa file kasebut ngemot kode sumber Jawa lan ngumpulake kode kasebut menyang file kelas sadurunge dieksekusi. Sampeyan bisa nyelehake parameter sawise utawa sadurunge jeneng file kode sumber. Sing diselehake sawise jeneng kasebut minangka paramèter nalika aplikasi dieksekusi. Sing diselehake sadurunge jeneng diterusake minangka paramèter menyang peluncur Jawa sawise kode dikompilasi. Opsi khusus kompiler (kayata classpath) uga bakal dikirim menyang javac kanggo kompilasi. Tuladha. baris:
java -classpath / home / foo / java Hello.java Bonjour
bakal padha karo baris iki:
javac -classpath / home / foo / java Hello.java
java -classpath / home / foo / java Hello Bonjour
[321] Klien HTTP (Standar) - Dhukungan API Klien HTTP wis distandarisasi. JDK 9 ngenalake API anyar kanggo ndhukung protokol Klien HTTP (JEP 110) . Wiwit JDK 9 uga ngenalake Java Platform Module System (JPMS) , API iki kalebu modul inkubator (iki minangka modul kanggo nyedhiyakake pangembang API anyar sing durung dadi standar ing Java SE, nalika API "urip" lagi ditindakake. disiapake kanggo mbusak - pangembang bisa nyoba API anyar lan nyoba menehi umpan balik). Sawise owah-owahan perlu digawe (API iki wis dianyari ing JDK 10), API bisa dadi bagéan saka standar. Dadi, API Klien HTTP saiki resmi kalebu ing Java SE 11 . Iki ngenalake modul lan paket anyar kanggo JDK, java.net.http . Jinis anyar sing utama yaiku: HttpClient HttpRequest HttpResponse WebSocket API iki bisa digunakake kanthi sinkron utawa ora sinkron. Ing mode asinkron, CompletionFutureslan digunakake CompletionStages. [320] Mbusak Jawa EE lan CORBA Modul Kanthi introduksi saka Java Platform Module System (JPMS) ing versi kaping sanga saka Jawa, dadi bisa pamisah file rt.jar monolithic menyang sawetara modul. Kajaba iku, JPMS ngidini sampeyan nggawe lingkungan runtime Java sing kalebu mung modul sing dibutuhake dening aplikasi sampeyan, sing nyuda ukurane. Kanthi wates modul sing ditetepake kanthi transparan, luwih gampang mbusak bagean Java API sing lawas - sing ditindakake JEP 320. Metamodule java.se.ee kalebu enem modul sing ora bakal dadi bagian saka standar Java SE 11 lan ora bakal kalebu. ing JDK:
  • corba
  • transaksi
  • aktivasi
  • xml.bind
  • xml.ws
  • xml.ws.anotasi
Modul iki ora digunakake ing JDK 9 lan ora kalebu standar ing kompilasi utawa eksekusi. Iki tegese yen sampeyan nyoba kanggo ngumpulake utawa mbukak aplikasi sing nggunakake API modul iki ing JDK 9 utawa JDK 10, iku gagal. Yen sampeyan nggunakake API saka modul iki ing kode, sampeyan kudu nyedhiyani minangka modul utawa perpustakaan kapisah.

API anyar

Akeh API anyar ing JDK 11 muncul amarga kalebu modul Klien HTTP lan Perekam Penerbangan ing standar basa . Kanggo dhaptar lengkap API, deleng perbandingan lengkap ing ngisor iki saka macem-macem versi JDK , disusun dening Gunnar Morling. Lan ing cathetan iki kita bakal dhaptar sawetara cara anyar sing ora kalebu ing java.net.http , jdk.jfr lan modul java.security . java.lang.String Bisa dibantah salah siji saka owah-owahan paling penting kanggo String ing JDK 11 API, ana sawetara cara anyar migunani.
  • boolean isBlank (): ngasilake bener yen senar kosong utawa mung ngemot spasi, palsu digunakake.

  • Stream lines(): Ngasilake aliran garis sing diekstrak saka senar iki, dipisahake dening terminator baris.

  • String repeat (int): Ngasilake senar sing regane minangka gabungan saka senar kasebut diulang kaping int .

  • String strip (): Ngasilake string kanthi kabeh spasi dibusak sadurunge utawa sawise karakter non-spasi pisanan.

  • String stripLeading (): Ngasilake senar kanthi kabeh spasi nganti karakter non-spasi pisanan dibusak.

  • String stripTrainling (): Ngasilake senar kanthi kabeh spasi sing kedadeyan sawise karakter non-spasi pungkasan dibusak.
strip()Cara kasebut wis nindakake sing padha trim (), nanging kanthi spasi, metode kasebut beda-beda. Yen ngono, trim()mung spasi sing dipotong, lan ing strip()- uga karakter khusus, kayata tab. java.lang.StringBuffer java.lang.StringBuilder Loro saka kelas iki ngemot cara anyar compareTo ()sing nampa StringBuffer/ StringBuilderlan bali int. Metode perbandingan leksikal mirip dengan metode baru compareTo() CharSequence. java.io.ByteArrayOutputStream
  • void writeBytes (byte []): nyerat kabeh bita saka parameter kanggo stream output java.io.FileReader
Ana rong konstruktor anyar ing kene sing ngidini sampeyan nemtokake Charset. java.io.FileWriter Four konstruktor anyar sing ngijini sampeyan kanggo nemtokake Charset. java.io.InputStream
  • io.InputStream nullInputStream (): bali InputStream, kang ora maca bita sembarang. Kepiye cara nggunakake metode iki? Sampeyan bisa mikir iku kaya / dev / null kanggo uncalan adoh output sampeyan ora perlu, utawa inject input sing tansah ngasilake nul bita.
java.io.OutputStream
  • io.OutputStream nullOutputStream ()
java.io.Reader
  • io.Reader nullReader ()
java.io.Panulis
  • io.Writer nullWriter ()
java.lang.Karakter
  • String toString (int): Iki overload saka cara ana, nanging nggunakake int tinimbang char.
java.lang.CharSequence
  • int compare (CharSequence, CharSequence): leksikografis mbandhingake rong conto CharSequence. Ngasilake nilai negatif, nol, utawa nilai positif yen urutan pisanan leksikografis kurang saka, padha, utawa luwih saka kaloro, mungguh.
java.lang.ref.Reference
    lang.Object clone (): Penginjil Jawa Simon Ritter ngakoni yen cara iki mbingungake dheweke. Kelas Referenceora ngleksanakake antarmuka Cloneablelan cara iki bakal tansah uncalan pangecualian CloneNotSupportedException. Nanging, pakar nyaranake yen cara iki bakal migunani kanggo apa wae ing mangsa ngarep.
java.lang.Runtime java.lang.System Ora ana cara anyar ing kene. Coba sebutno cara kasebut runFinalizersOnExit ()wis dibusak saka loro kelas kasebut, sing bisa nyebabake masalah kompatibilitas. java.lang.Thread Ora cara tambahan, kita mung bakal sebutno sing destroy ()padha stop (Throwable)dibusak. Nanging stop (), sing ora njupuk bantahan, isih kasedhiya. Elinga iki amarga bisa uga ana masalah kompatibilitas. java.nio.ByteBuffer java.nio.CharBuffer java.nio.DoubleBuffer java.nio.FloatBuffer java.nio.LongBuffer java.nio.ShortBuffer Ing kabeh kelas kasebut, pangembang basa nambahake metode mismatch ()sing nemokake lan ngasilake indeks relatif saka mismatch pisanan antarane buffer iki lan buffer diwenehi. java.nio.channels.SelectionKey
  • int interestOpsAnd (int)

  • int interestOpsOr (int)
java.nio.channels.Selector
  • int select (java.util.function.Consumer, long): Milih lan nglakokake tumindak ing tombol sing saluran sing cocog wis siyap kanggo operasi I/O. Parameter sing dawa yaiku wektu entek.

  • int select (java.util.function.Consumer): dianggo kaya cara ing ndhuwur, nanging tanpa wektu entek.

  • int selectNow (java.util.function.Consumer): dianggo kaya cara ing ndhuwur, mung iku non-blocking.

java.nio.file.Files
  • String readString (Path): Maca kabeh isi saka file menyang string, dekoding bita menyang karakter nggunakake UTF-8 encoding .

  • String readString (Path, Charset): Bisa kaya cara ing ndhuwur, nanging decodes byte menyang karakter nggunakake Charset.

  • Path writeString (Path, CharSequence, java.nio.file. OpenOption []): Yen sampeyan nulis urutan karakter CharSequencemenyang file, karakter kasebut bakal dienkode menyang bait (nggunakake UTF-8 ).

  • Path writeString (Path, CharSequence, java.nio.file. Charset, OpenOption []): dianggo kaya cara ing ndhuwur, mung karakter sing dienkode menyang bita nggunakake Charset.
java.nio.file.Path
  • Path (String, String []): Ngasilake Path, ngowahi pathstring utawa urutan strings sing nalika digabung mbentuk pathstring.

  • Path (net.URI): Ngasilake path kanthi ngowahi URI.
java.util.Collection
  • Object [] toArray (java.util.function.IntFunction): Ngasilake array ngemot kabeh unsur ing koleksi iki, nggunakake fungsi generator kasedhiya kanggo disebaraké Uploaded bali.
java.util.concurrent.PriorityBlockingQueue java.util.PriorityQueue
  • void forEach (java.util.function.Consumer): Nindakake tumindak kasebut ing saben unsur Iterable nganti kabeh unsur wis diproses utawa tumindak mbalang pangecualian.

  • boolean removeAll (java.util.Collection): Mbusak kabeh unsur koleksi iki sing uga ana ing koleksi kasebut (operasi opsional).

  • boolean removeIf (java.util.function.Predicate): Mbusak kabeh unsur koleksi iki sing marem predikat diwenehi.

  • boolean retainAll (java.util.Collection): Ngreksa mung unsur ing koleksi iki sing ana ing koleksi kasebut (opsional operasi).
java.util.concurrent.TimeUnit
  • long convert (java.time.Duration): Ngonversi wektu tartamtu menyang unit iki.
java.util.function.Predicate
  • Predicate not(Predicate): ngasilake predikat sing negasi saka predikat diwenehi.
Contone, kode ing ngisor iki:
lines.stream ()

.filter (s ->! s.isBlank ())
bisa diowahi dadi:
lines.stream ()

.filter (Predicate.not (String :: ISBLANK))
lan yen kita nggunakake impor statis, banjur iki sing kita entuk:
lines.stream ()
.filter (not(String :: ISBLANK))
java.util.Optional java.util.OptionalInt java.util.OptionalDouble java.util.OptionalLong
  • boolean isEmpty (): Ngasilake bener yen ora ana regane , salah yen ora .
java.util.regex.Pola
  • Predicate asMatchPredicate (): pakar Jawa Simon Ritter pracaya ana bisa uga ana permata API JDK 11 nyata sing didhelikake ing kene. Cara iki nggawe predikat sing mriksa apa pola iki cocog karo string input sing diwenehake.
java.util.zip.Deflater
  • int deflate (ByteBuffer): Ngompres data input lan ngisi buffer sing ditemtokake karo data sing dikompres.

  • int deflate (ByteBuffer, int): Ngompres data input lan ngisi buffer sing ditemtokake karo data sing dikompres. Ngasilake jumlah nyata data sing dikompres.

  • void setDictionary (ByteBuffer): Nyetel kamus diwenehi kanggo dikompres menyang bita ing buffer diwenehi. Iki minangka kakehan cara sing wis ana sing saiki bisa nampa ByteBuffer, tinimbang array byte.

  • void setInput (ByteBuffer): Nyetel data input sing bakal dikompres. Iku uga overload saka cara ana.
java.util.zip.Inflater
  • int inflate (ByteBuffer): Unpacks byte menyang buffer kasebut. Ngasilake jumlah bita sing ora dikompres.

  • void setDictionary (ByteBuffer): Nyetel kamus diwenehi menyang bita ing buffer diwenehi. Iku wangun overloaded saka cara ana.

  • void setInput (ByteBuffer): Nyetel data input kanggo dekompresi. Wangun overloaded saka cara ana.
javax.print.attribute.standard.DialogOwner Iki kelas anyar ing JDK 11 lan kelas atribut digunakake kanggo ndhukung print utawa panjalukan kaca pangaturan dhewe kanggo ditampilake ing ndhuwur kabeh windows utawa jendhela tartamtu. javax.swing.DefaultComboBoxModel javax.swing.DefaultListModel
  • void addAll (Collection): Nambah kabeh unsur sing ana ing koleksi.

  • void addAll (int, Collection): Nambahake kabeh unsur sing ana ing koleksi, wiwit saka indeks kasebut.
javax.swing.ListSelectionModel
  • int [] getSelectedIndices (): Ngasilake larik kabeh indeks sing dipilih ing model sing dipilih kanthi urutan munggah.

  • int getSelectedItemsCount (): Ngasilake jumlah item sing dipilih.
jdk.jshell.EvalException
  • shell.JShellException getCause (): Ngasilake alesan throwable ing klien execution presented dening EvalException iki, utawa null yen alesan ora ana utawa ora dingerteni.

Fitur non-developer Java 11

[181] Kontrol Akses Berbasis Nest Jawa lan basa liyane ndhukung kelas bersarang liwat kelas njero. Kanggo nindakake iki, compiler kudu nindakake trik tartamtu. Tuladhane:
public class Outer {
    private int outerInt;

     class Inner {
       public void printOuterInt() {
         System.out.println("Outer int = " + outerInt);
       }
     }
   }
Compiler ngowahi iki kanggo ngasilake kaya ing ngisor iki sadurunge kompilasi:
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());
      }
    }
Senajan sacara logis kelas njero minangka bagéan saka kode sing padha karo kelas njaba, nanging dikompilasi minangka kelas sing kapisah. Mulane, operasi iki mbutuhake cara gabung sintetik sing kudu digawe dening compiler kanggo nyedhiyakake akses menyang lapangan pribadi saka kelas njaba. JEP iki ngenalake konsep sarang, ing ngendi rong anggota saka sarang sing padha (Outer lan Inner ing conto kita) minangka kanca nesting. Loro atribut anyar ditetepake kanggo format file kelas: NestHost lan NestMembers . Owah-owahan iki migunani kanggo basa liya sing ndhukung kelas lan bytecode bersarang. Fungsi iki ngenalake telung cara anyar kanggo java.lang.Class : Class getNestHost () Class [] getNestMembers () boolean isNestmateOf (Class) [309] Dynamic Class-File Constants JEP iki njlèntrèhaké ekstensi menyang format file kelas kanggo ndhukung sing anyar. wangun blumbang ngengkel CONSTANT_Dynamic. Gagasan konstanta dinamis katon kaya oxymoron, nanging sampeyan bisa nganggep minangka nilai pungkasan ing Jawa 11. Nilai konstanta pooling ora disetel ing wektu kompilasi (ora kaya konstanta liyane), nanging nggunakake bootstrap. cara kanggo nemtokake nilai ing lead time. Mulane, nilai kasebut dinamis, nanging amarga nilai kasebut mung disetel sapisan, iku uga konstan. Fitur iki utamane ditujokake kanggo wong ngembangake basa lan kompiler anyar sing bakal ngasilake bytecode lan file kelas minangka output kanggo mbukak ing JVM. [315] Ngapikake Aarch64 Intrinsik JEP iki diusulake dening komunitas Red Hat. JVM saiki bisa nggunakake instruksi luwih specialized kasedhiya ing pesawat instruction Arm 64. Ing tartamtu, iki mbenakake kinerja saka, cara sin ()lan cos ()kelas java.lang.Math . [318] Epsilon: A No-Op Sampah Collector Kaya JEP 315 , sampeyan bisa matur nuwun Red Hat kanggo introduksi saka Epsilon sampah kolektor. Epsilon ora biasa amarga ora ngumpulake sampah! Nalika nggawe obyek anyar, allocates memori yen perlu, nanging ora mbalekake papan dikuwasani dening obyek ora kadhaptar. “ Apa gunane? ", - sampeyan takon. Pranyata "koleksi sampah" iki duwe rong kegunaan: log ()
  1. Kaping pisanan, kolektor sampah iki dirancang kanggo mesthekake yen algoritma GC anyar dievaluasi babagan pengaruh kinerja. Ide iki kanggo mbukak aplikasi sampel karo Epsilon lan ngasilake set metrik. Algoritma pengumpulan sampah anyar diaktifake, tes sing padha ditindakake, banjur asile dibandhingake.

  2. Kanggo tugas sing cendhak banget (mikirake fungsi tanpa server ing awan) ing ngendi sampeyan bisa njamin sampeyan ora bakal ngluwihi memori sing diparengake kanggo numpuk. Iki bisa nambah kinerja kanthi ngilangi nduwur sirah (kalebu ngumpulake statistik sing dibutuhake kanggo mutusake apa bakal mbukak kolektor) ing kode aplikasi. Yen spasi tumpukan wis entek, JVM bisa uga salah konfigurasi ing salah siji saka telung cara:
    • Biasa diarani OutOfMemoryError.
    • Nindakake reset tumpukan
    • Hard drive JVM gagal lan bisa uga nindakake tugas liyane (kayata miwiti debugger).
[328]: Flight Recorder Flight Recorder minangka kerangka akuisisi data tingkat rendah kanggo JVM. Sadurunge JDK 11, iki minangka fitur komersial ing binar Oracle JDK. Oracle saiki ngilangi beda fungsional antarane Oracle JDK lan siji mbangun saka OpenJDK. Iki sing ditindakake Flight Recorder :
  • Nyedhiyani API kanggo ngasilake lan nggunakake data minangka acara
  • Nyedhiyakake mekanisme buffer lan format data binar
  • Ngidini kustomisasi lan nyaring acara
  • Nyedhiyani acara kanggo OS, JVM HotSpot lan perpustakaan JDK
Ana rong modul anyar ing kene: jdk.jfr lan jdk.management.jfr . [329] Algoritma kriptografi ChaCha20 lan Poly1305 JEP iki babagan nganyari cipher sing digunakake dening JDK. Kasus iki ngetrapake algoritma enkripsi ChaCha20 lan ChaCha20-Poly1305 kaya sing kasebut ing RFC 7539. ChaCha20 minangka cipher stream sing relatif anyar sing bisa ngganti cipher RC4 sing lawas lan ora aman . [333] ZGC: Kolektor Sampah Low-Latency Scalable Sampah Experimental scalable low-latency collector. Dirancang kanggo nggunakake aplikasi sing mbutuhake tumpukan gedhe (multigigabyte) lan latensi sing sithik. Iki nggunakake tumpukan siji generasi lan nindakake paling (nanging ora kabeh) karya koleksi sampah bebarengan karo aplikasi. [332] Transport Layer Security (TLS) 1.3 TLS 1.3 (RFC 8446) minangka tembelan utama kanggo protokol keamanan lapisan transportasi TLS sing nyedhiyakake keamanan lan perbaikan kinerja sing signifikan tinimbang versi sadurunge. JDK saiki ndhukung versi protokol iki. Materi kasebut adhedhasar artikel dening Simon Ritter lan dokumentasi resmi .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION