JavaRush /จาวาบล็อก /Random-TH /เปิดตัว Java 11: คุณสมบัติและความสามารถใหม่

เปิดตัว Java 11: คุณสมบัติและความสามารถใหม่

เผยแพร่ในกลุ่ม
ก่อนหน้านี้ Java เวอร์ชันใหม่ไม่ค่อยปรากฏและมีความล่าช้า ตอนนี้Oracleประสบความสำเร็จในการรักษาจังหวะ "Java ใหม่ทุกๆ หกเดือน" ที่ตั้งไว้เอง เมื่อไม่กี่วันก่อน ตามกำหนดเวลา ในที่สุดเราก็ได้รับJava SE 11และการใช้งานJDK (Java Development Kit) เปิดตัว Java 11: คุณสมบัติและความสามารถใหม่ - 1เช่นเคย เวอร์ชันใหม่จะเข้ากันได้กับเวอร์ชันเก่า และการสนับสนุน Java 11 จะสิ้นสุดไม่ช้ากว่าเดือนธันวาคม 2569

คุณสมบัติใหม่ใน Java SE 11 (มองเห็นได้สำหรับนักพัฒนา)

โปรดจำไว้ว่าใน Java การเปลี่ยนแปลงเกิดขึ้นผ่านการใช้งาน JEP “JDK Enhancement Proposal” JEPเป็นข้อเสนอเพื่อปรับปรุง OpenJDK และอาจได้รับการอนุมัติ ล่าช้า หรือถูกปฏิเสธ โดยพื้นฐานแล้ว การรวบรวม JEP ถือเป็นกลยุทธ์การพัฒนาสำหรับ OpenJDK ในวงเล็บเหลี่ยมก่อน "คุณลักษณะ" ใหม่ เราจะระบุหมายเลขของ JEP ที่เกี่ยวข้อง [323] ไวยากรณ์ตัวแปรท้องถิ่นสำหรับพารามิเตอร์แลมบ์ดา - ไวยากรณ์ var สำหรับพารามิเตอร์แลมบ์ดา Java 10 แนะนำคีย์เวิร์ด varซึ่งทำให้ไม่สามารถระบุประเภทของตัวแปรท้องถิ่นได้อย่างชัดเจน สิ่งนี้ทำให้โค้ดง่ายขึ้น JEP 323ขยายการใช้ไวยากรณ์นี้ด้วยนิพจน์แลมบ์ดา ตัวอย่างง่ายๆ:
list.stream ()
                 .map ((var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
ตามที่Simon Ritterนักเผยแพร่ Java ที่มีชื่อเสียงเขียนไว้ โปรแกรมเมอร์ Java ที่มีประสบการณ์จะทราบว่าการใช้ var ในกรณีนี้อาจไม่จำเป็น เนื่องจากโค้ดด้านบนสามารถถูกแทนที่ด้วยสิ่งต่อไปนี้:
list.stream ()
                  .map (s -> s.toLowerCase ())
                  .collect (Collectors.toList ());
เหตุใดจึงต้องสนับสนุน var? มีกรณีพิเศษเพียงกรณีเดียวคือ เมื่อคุณต้องการเพิ่มคำอธิบายประกอบให้กับพารามิเตอร์ lambda สิ่งนี้ไม่สามารถทำได้หากไม่มีบางประเภทที่เกี่ยวข้อง และเพื่อหลีกเลี่ยงการใช้ประเภทที่ชัดเจน เราสามารถทำให้ทุกอย่างง่ายขึ้นโดยใช้ var ดังนี้:
list.stream ()
                 .map ((@ Notnull var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
[330] เรียกใช้โปรแกรมซอร์สโค้ดไฟล์เดียว การปรับปรุง Java Launcher เพื่อเรียกใช้โปรแกรมเป็นไฟล์เดียวที่มีซอร์สโค้ด Java Java มักถูกวิพากษ์วิจารณ์ถึงไวยากรณ์ที่ละเอียดและ "พิธีการ" หลายขั้นตอนในการเปิดตัวแม้แต่แอปพลิเคชันที่ไม่สำคัญ บางครั้งสิ่งนี้ทำให้มือใหม่กลัว เพื่อเขียนแอพพลิเคชั่นเพียงพิมพ์คำว่า " Hello World! " " คุณต้องเขียนคลาสด้วยvoidวิธี public static main และใช้นามสกุลSystem.out.println. เมื่อทำสิ่งนี้แล้ว คุณ จะต้องคอมไพล์โค้ดโดยใช้javac ในที่สุด หลังจากนี้ คุณสามารถเปิดแอปพลิเคชันได้ ซึ่งจะแสดงคำทักทายที่โชคร้าย (แน่นอนว่า สภาพแวดล้อมการพัฒนาแบบรวม ทั้งIDEAและที่อยู่ในJavaRushดำเนินการ "เวทมนตร์ในการเปิดแอป" ด้วยตัวมันเอง - บันทึกของบรรณาธิการ ). พูดตามตรง: ในภาษาการเขียนโปรแกรมส่วนใหญ่ สคริปต์จริงสำหรับการรันโปรแกรมจะดูง่ายกว่ามาก JEP 330 ช่วยลดความจำเป็นในการคอมไพล์แอปพลิเคชันไฟล์เดียว ดังนั้นหากคุณใช้บรรทัดคำสั่ง เพียงพิมพ์
java HelloWorld.java
ตัวเรียกใช้งาน Java จะตรวจพบว่าไฟล์มีซอร์สโค้ด Java และคอมไพล์โค้ดลงในไฟล์คลาสก่อนดำเนินการ คุณสามารถวางพารามิเตอร์ไว้หลังหรือก่อนชื่อไฟล์ซอร์สโค้ดได้ ที่อยู่หลังชื่อจะถูกส่งผ่านเป็นพารามิเตอร์เมื่อแอปพลิเคชันถูกดำเนินการ สิ่งที่วางไว้ก่อนชื่อจะถูกส่งเป็นพารามิเตอร์ไปยังตัวเรียกใช้งาน Java หลังจากคอมไพล์โค้ดแล้ว ตัวเลือกเฉพาะของคอมไพเลอร์ (เช่น classpath) จะถูกส่งผ่านไปยังjavacเพื่อการคอมไพล์ ด้วย ตัวอย่าง. เส้น:
java -classpath / home / foo / java Hello.java Bonjour
จะเทียบเท่ากับบรรทัดเหล่านี้:
javac -classpath / home / foo / java Hello.java
java -classpath / home / foo / java Hello Bonjour
[321] ไคลเอนต์ HTTP (มาตรฐาน) - การสนับสนุน HTTP Client API ได้รับมาตรฐานแล้ว JDK 9 เปิดตัวAPIใหม่เพื่อรองรับโปรโตคอลไคลเอนต์ HTTP (JEP 110) เนื่องจาก JDK 9 ยังเปิดตัวJava Platform Module System (JPMS) API นี้จึงถูกรวมเป็นโมดูลบ่มเพาะ (เหล่านี้เป็นโมดูลเพื่อให้นักพัฒนามี API ใหม่ที่ยังไม่ได้เป็นมาตรฐานใน Java SE ในขณะที่ API "สด" กำลังเป็นอยู่ เตรียมพร้อมสำหรับการลบออก - นักพัฒนาสามารถลองใช้ API ใหม่และพยายามให้ข้อเสนอแนะ) เมื่อทำการเปลี่ยนแปลงที่จำเป็น (API นี้ได้รับการอัปเดตใน JDK 10) แล้ว API ก็สามารถเป็นส่วนหนึ่งของมาตรฐานได้ ดังนั้นHTTP Client API จึงรวมอยู่ใน Java SE 11 อย่างเป็นทางการแล้ว นี่เป็นการแนะนำโมดูลและแพ็คเกจใหม่สำหรับJDK, java.net.http ประเภทใหม่หลักๆ ได้แก่: HttpClient HttpRequest HttpResponse WebSocket API นี้สามารถใช้ได้แบบซิงโครนัสหรือแบบอะซิงโครนัส ในโหมดอะซิงโครนัสCompletionFuturesและ มีการใช้ CompletionStages. [320] ลบโมดูล Java EE และ CORBAด้วยการเปิดตัวJava Platform Module System (JPMS)ใน Java เวอร์ชันที่เก้า ทำให้เป็นไปได้ที่จะแยก ไฟล์ rt.jar แบบเสาหิน ออกเป็นหลายโมดูล นอกจากนี้ JPMS ยังช่วยให้คุณสร้างสภาพแวดล้อมรันไทม์ Java ที่รวมเฉพาะโมดูลที่จำเป็นสำหรับแอปพลิเคชันของคุณ ซึ่งช่วยลดขนาดลงได้อย่างมาก ด้วยขอบเขตของโมดูลที่กำหนดอย่างโปร่งใส จึงง่ายกว่ามากในการลบส่วนที่ล้าสมัยของ Java API - นั่นคือสิ่งที่ JEP 320 ทำ metamodule java.se.eeประกอบด้วยหกโมดูลที่จะไม่ได้เป็นส่วนหนึ่งของมาตรฐาน Java SE 11 และจะไม่รวมอยู่ด้วย ใน JDK:
  • คอร์บา
  • ธุรกรรม
  • การเปิดใช้งาน
  • xml.bind
  • xml.ws
  • xml.ws.คำอธิบายประกอบ
โมดูลเหล่านี้เลิกใช้แล้วใน JDK 9 และไม่ได้รวมอยู่ในค่าเริ่มต้นในการคอมไพล์หรือดำเนินการ ซึ่งหมายความว่าหากคุณพยายามคอมไพล์หรือรันแอปพลิเคชันที่ใช้ API ของโมดูลเหล่านี้บน JDK 9 หรือ JDK 10 ก็จะล้มเหลว หากคุณใช้ API ของโมดูลเหล่านี้ในโค้ดของคุณ คุณจะต้องจัดเตรียมให้เป็นโมดูลหรือไลบรารีแยกต่างหาก

API ใหม่

API ใหม่จำนวนมากใน JDK 11 ปรากฏขึ้นด้วยการรวม โมดูล HTTP ClientและFlight Recorder ไว้ในมาตรฐาน ภาษา หากต้องการดูรายการ API ทั้งหมด โปรดดูการเปรียบเทียบแบบครอบคลุมของ JDK เวอร์ชันต่างๆที่รวบรวมโดย Gunnar Morling และในบันทึกนี้ เรา จะ แสดงรายการวิธีการใหม่บางอย่างที่ไม่รวมอยู่ใน โมดูล java.net.http , jdk.jfrและjava.security java.lang.String อาจ เป็นหนึ่งใน การเปลี่ยนแปลงที่สำคัญที่สุดของ Stringใน JDK 11 API มีวิธีการใหม่ที่มีประโยชน์หลายวิธี
  • boolean isBlank (): คืนค่าเป็นจริงหากสตริงว่างเปล่าหรือมีเพียงช่องว่าง มิฉะนั้นจะคืนค่าเป็นเท็จ

  • Stream lines(): ส่งคืนกระแสของบรรทัดที่แยกจากสตริงนี้ โดยคั่นด้วยตัวยุติบรรทัด

  • String repeat (int): ส่งกลับสตริงที่มีค่าเป็นการต่อสตริงนั้นครั้งint ที่ซ้ำกัน

  • String strip (): ส่งกลับสตริงโดยเอาช่องว่างทั้งหมดออกก่อนหรือหลังอักขระตัวแรกที่ไม่ใช่ช่องว่าง

  • String stripLeading (): ส่งกลับสตริงที่มีการเว้นวรรคทั้งหมดจนถึงอักขระที่ไม่ใช่ช่องว่างตัวแรกที่ถูกลบออก

  • String stripTrainling (): ส่งกลับสตริงที่มีการเว้นวรรคทั้งหมดที่เกิดขึ้นหลังจากอักขระที่ไม่ใช่ช่องว่างตัวสุดท้ายถูกลบออก
strip()วิธีการนี้ได้ทำ สิ่งที่คล้ายกัน แล้ว trim ()แต่การเว้นวรรควิธีการเหล่านี้มีความหมายต่างกัน ในกรณีtrim()ที่ตัดเฉพาะช่องว่างและในstrip()- รวมถึงอักขระพิเศษเช่นแท็บ java.lang.StringBuffer java.lang.StringBuilder ทั้งสองคลาสนี้มีเมธอดใหม่ที่compareTo ()ยอมรับStringBuffer/ StringBuilderและส่งคืน intวิธีการเปรียบเทียบคำศัพท์จะคล้ายกับวิธีการcompareTo() CharSequenceใหม่ java.io.ByteArrayOutputStream
  • void writeBytes (byte []): เขียนไบต์ทั้งหมดของพารามิเตอร์ไปยัง สตรีมเอาต์พุต java.io.FileReader
มี Constructor ใหม่สองตัวที่นี่ที่ให้คุณระบุCharsetได้ java.io.FileWriter ตัวสร้างใหม่สี่ตัวที่อนุญาตให้คุณระบุCharset java.io.InputStream
  • io.InputStream nullInputStream (): ส่งคืนInputStreamซึ่งไม่ได้อ่านไบต์ใดๆ วิธีการใช้วิธีนี้? คุณสามารถคิดว่ามันเหมือนกับ /dev/null เพื่อทิ้งเอาต์พุตที่คุณไม่ต้องการออกไป หรือฉีดอินพุตที่ส่งคืนศูนย์ไบต์เสมอ
java.io.OutputStream
  • io.OutputStream nullOutputStream ()
java.io.Reader
  • io.Reader nullReader ()
java.io.นักเขียน
  • io.Writer nullWriter ()
java.lang.ตัวละคร
  • String toString (int): นี่เป็นการโอเวอร์โหลดของวิธีการที่มีอยู่ แต่ใช้ int แทน char
java.lang.CharSequence
  • int compare (CharSequence, CharSequence): เปรียบเทียบสองกรณีโดยใช้CharSequenceพจนานุกรม ส่งกลับค่าลบ ศูนย์ หรือค่าบวก หากลำดับแรกน้อยกว่า เท่ากับ หรือมากกว่าลำดับที่สองตามลำดับ
java.lang.ref.อ้างอิง
    lang.Object clone (): Simon Ritter ผู้เผยแพร่ศาสนา Java ยอมรับว่าวิธีนี้ทำให้เขาสับสน คลาส Referenceไม่ได้ใช้อินเทอร์เฟซและ Cloneableเมธอดนี้จะทำให้เกิดข้อยกเว้นเสมอ CloneNotSupportedExceptionอย่างไรก็ตาม ผู้เชี่ยวชาญแนะนำว่าวิธีนี้จะเป็นประโยชน์กับบางสิ่งบางอย่างในอนาคต
java.lang.Runtime java.lang.System ไม่มีวิธีการใหม่ที่นี่ สมมติว่าวิธีการนี้runFinalizersOnExit ()ได้ถูกลบออกจากคลาสทั้งสองนี้แล้ว ซึ่งอาจทำให้เกิดปัญหาความเข้ากันได้ java.lang.Thread ไม่มีวิธีการเพิ่มเติม เราจะพูดถึงว่าdestroy ()วิธีเหล่านั้นstop (Throwable)ถูกลบไปแล้ว เท่านั้น อย่างไรก็ตามstop ()ซึ่งไม่มีข้อโต้แย้งใดๆ ก็ยังคงมีอยู่ โปรดจำไว้เสมอเนื่องจากอาจมีปัญหาความเข้ากันได้ java.nio.ByteBuffer java.nio.CharBuffer java.nio.DoubleBuffer java.nio.FloatBuffer java.nio.LongBuffer java.nio.ShortBuffer ในคลาสเหล่านี้ทั้งหมด นักพัฒนาภาษาได้เพิ่มเมธอดmismatch ()ที่ค้นหาและส่งกลับดัชนีสัมพัทธ์ของ ไม่ตรงกันครั้งแรกระหว่างบัฟเฟอร์นี้และบัฟเฟอร์ที่กำหนด java.nio.channels.SelectionKey
  • int interestOpsAnd (int)

  • int interestOpsOr (int)
java.nio.channels.Selector
  • int select (java.util.function.Consumer, long): เลือกและดำเนินการกับคีย์ที่มีช่องสัญญาณที่เกี่ยวข้องพร้อมสำหรับการดำเนินการ I/O พารามิเตอร์แบบยาวคือการหมดเวลา

  • int select (java.util.function.Consumer): ทำงานเหมือนวิธีการข้างต้น แต่ไม่มีการหมดเวลา

  • int selectNow (java.util.function.Consumer): ทำงานเหมือนกับวิธีการข้างต้น เพียงแต่ไม่มีการปิดกั้น

java.nio.file.Files
  • String readString (Path): อ่านเนื้อหาทั้งหมดจากไฟล์เป็นสตริง ถอดรหัสไบต์เป็นอักขระโดยใช้ การเข้ารหัส UTF-8

  • String readString (Path, Charset): ทำงานเหมือนกับวิธีการข้างต้น แต่ถอดรหัสไบต์เป็นอักขระโดยใช้Charset.

  • Path writeString (Path, CharSequence, java.nio.file. OpenOption []): หากคุณเขียนลำดับอักขระCharSequenceลงในไฟล์ อักขระเหล่านั้นจะถูกเข้ารหัสเป็นไบต์ (โดยใช้UTF-8 )

  • Path writeString (Path, CharSequence, java.nio.file. Charset, OpenOption []): ทำงานเหมือนวิธีการข้างต้น เฉพาะอักขระเท่านั้นที่ถูกเข้ารหัสเป็นไบต์โดยใช้Charset.
java.nio.file.Path
  • Path(String, String[]): ส่งกลับ Path โดยเปลี่ยน pathstring หรือลำดับของสตริงที่เมื่อรวมกันแล้วจะกลายเป็น pathstring

  • เส้นทาง (net.URI): ส่งคืนเส้นทางโดยการแปลง URI
java.util.คอลเลกชัน
  • Object [] toArray (java.util.function.IntFunction): ส่งคืนอาร์เรย์ที่มีองค์ประกอบทั้งหมดในคอลเลกชันนี้ โดยใช้ฟังก์ชันตัวสร้างที่มีให้เพื่อกระจายอาร์เรย์ที่ส่งคืน
java.util.concurrent.PriorityBlockingQueue java.util.PriorityQueue
  • void forEach (java.util.function.Consumer): ดำเนินการตามที่ระบุกับแต่ละ องค์ประกอบ ที่ทำซ้ำได้จนกว่าองค์ประกอบทั้งหมดจะได้รับการประมวลผลหรือการดำเนินการส่งข้อยกเว้น

  • boolean removeAll (java.util.Collection): ลบองค์ประกอบทั้งหมดของคอลเลกชันนี้ที่มีอยู่ในคอลเลกชันที่ระบุด้วย (การดำเนินการเสริม)

  • boolean removeIf (java.util.function.Predicate): ลบองค์ประกอบทั้งหมดของคอลเลกชันนี้ที่เป็นไปตามภาคแสดงที่กำหนด

  • boolean retainAll (java.util.Collection): เก็บรักษาเฉพาะองค์ประกอบในคอลเลกชันนี้ที่มีอยู่ในคอลเลกชันที่ระบุ (การดำเนินการเสริม)
java.util.concurrent.TimeUnit
  • long convert (java.time.Duration): แปลงระยะเวลาที่กำหนดเป็นหน่วยนี้
java.util.function.ภาคแสดง
  • Predicate not(Predicate): ส่งคืนภาคแสดงที่เป็นค่าปฏิเสธของภาคแสดงที่กำหนด
ตัวอย่างเช่น รหัสต่อไปนี้:
lines.stream ()

.filter (s ->! s.isBlank ())
สามารถแปลงเป็นสิ่งนี้:
lines.stream ()

.filter (Predicate.not (String :: ISBLANK))
และหากเราใช้การนำเข้าแบบคงที่ นี่คือสิ่งที่เราได้รับ:
lines.stream ()
.filter (not(String :: ISBLANK))
java.util.Optional java.util.OptionalInt java.util.OptionalDouble java.util.OptionalLong
  • boolean isEmpty (): คืนค่า เป็นจริงหากไม่มีค่า มิฉะนั้นจะ คืนค่า เป็นเท็จ
java.util.regex.รูปแบบ
  • Predicate asMatchPredicate (): ผู้เชี่ยวชาญ Java Simon Ritter เชื่อว่าอาจมีเจม JDK 11 API จริงซ่อนอยู่ที่นี่ เมธอดนี้จะสร้างเพรดิเคตเพื่อตรวจสอบว่ารูปแบบนี้ตรงกับสตริงอินพุตที่กำหนดหรือไม่
java.util.zip.Deflater
  • int deflate (ByteBuffer): บีบอัดข้อมูลอินพุตและเติมบัฟเฟอร์ที่ระบุด้วยข้อมูลที่บีบอัด

  • int deflate (ByteBuffer, int): บีบอัดข้อมูลอินพุตและเติมบัฟเฟอร์ที่ระบุด้วยข้อมูลที่บีบอัด ส่งกลับจำนวนข้อมูลที่ถูกบีบอัดตามจริง

  • void setDictionary (ByteBuffer): ตั้งค่าพจนานุกรมที่กำหนดให้บีบอัดเป็นไบต์ในบัฟเฟอร์ที่กำหนด นี่เป็นการโอเวอร์โหลดของวิธีการที่มีอยู่ซึ่งตอนนี้สามารถยอมรับByteBufferแทนที่จะเป็นอาร์เรย์ไบต์ได้

  • void setInput (ByteBuffer): ตั้งค่าข้อมูลอินพุตที่จะบีบอัด นอกจากนี้ยังเป็นการโอเวอร์โหลดของวิธีการที่มีอยู่อีกด้วย
java.util.zip.ตัวพอง
  • int inflate (ByteBuffer): คลายไบต์ลงในบัฟเฟอร์ที่ระบุ ส่งกลับจำนวนไบต์ที่ไม่มีการบีบอัดจริง

  • void setDictionary (ByteBuffer): ตั้งค่าพจนานุกรมที่กำหนดให้เป็นไบต์ในบัฟเฟอร์ที่กำหนด เป็นรูปแบบการโอเวอร์โหลดของวิธีการที่มีอยู่

  • void setInput (ByteBuffer): ตั้งค่าข้อมูลอินพุตสำหรับการบีบอัด รูปแบบการโอเวอร์โหลดของวิธีการที่มีอยู่
javax.print.attribute.standard.DialogOwner นี่คือคลาสใหม่ใน JDK 11 และเป็นคลาสแอททริบิวต์ที่ใช้เพื่อรองรับคำขอหน้าการพิมพ์หรือการปรับแต่งที่จะแสดงที่ด้านบนของหน้าต่างทั้งหมดหรือหน้าต่างเฉพาะ javax.swing.DefaultComboBoxModel javax.swing.DefaultListModel
  • void addAll (Collection): เพิ่มองค์ประกอบทั้งหมดที่มีอยู่ในคอลเลกชัน

  • void addAll (int, Collection): เพิ่มองค์ประกอบทั้งหมดที่มีอยู่ในคอลเลกชัน โดยเริ่มต้นจากดัชนีที่ระบุ
javax.swing.ListSelectionModel
  • int [] getSelectedIndices (): ส่งกลับอาร์เรย์ของดัชนีที่เลือกทั้งหมดในโมเดลที่เลือกโดยเรียงลำดับจากน้อยไปหามาก

  • int getSelectedItemsCount (): ส่งกลับจำนวนรายการที่เลือก
jdk.jshell.EvalException
  • shell.JShellException getCause (): ส่งคืนเหตุผลที่สามารถส่งกลับได้ในไคลเอนต์การดำเนินการที่นำเสนอโดย EvalException นี้ หรือคืนค่าเป็นโมฆะหากไม่มีเหตุผลหรือไม่ทราบ

คุณสมบัติที่ไม่ใช่สำหรับนักพัฒนาของ Java 11

[181] Java การควบคุมการเข้าถึงแบบ Nest-Based และภาษาอื่น ๆ รองรับคลาสที่ซ้อนกันผ่านคลาสภายใน เพื่อให้ทำงานได้ คอมไพเลอร์จะต้องดำเนินการบางอย่าง ตัวอย่างเช่น:
public class Outer {
    private int outerInt;

     class Inner {
       public void printOuterInt() {
         System.out.println("Outer int = " + outerInt);
       }
     }
   }
คอมไพเลอร์แก้ไขสิ่งนี้เพื่อสร้างสิ่งต่อไปนี้ก่อนที่จะคอมไพล์:
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());
      }
    }
แม้ว่าตามตรรกะแล้วคลาสภายในจะเป็นส่วนหนึ่งของโค้ดเดียวกันกับคลาสภายนอก แต่จะถูกคอมไพล์เป็นคลาสที่แยกจากกัน ดังนั้นการดำเนินการนี้ต้องใช้วิธีการรวมแบบสังเคราะห์ที่ต้องสร้างขึ้นโดยคอมไพเลอร์เพื่อให้สามารถเข้าถึง ฟิลด์ ส่วนตัวของคลาสภายนอกได้ JEP นี้แนะนำแนวคิดเรื่องรัง โดยที่สมาชิกสองตัวในรังเดียวกัน (ด้านนอกและด้านในในตัวอย่างของเรา) เป็นเพื่อนที่ทำรังกัน มีการกำหนดแอ็ตทริบิวต์ ใหม่สองรายการสำหรับรูปแบบไฟล์คลาส: NestHostและNestMembers การเปลี่ยนแปลงเหล่านี้มีประโยชน์สำหรับภาษาอื่นที่รองรับคลาสที่ซ้อนกันและรหัสไบต์ ฟังก์ชันนี้แนะนำวิธีการใหม่สามวิธีสำหรับjava.lang.Class : Class getNestHost () Class [] getNestMembers () boolean isNestmateOf (Class) [309] Dynamic Class-File Constants JEP นี้อธิบายส่วนขยายของรูปแบบไฟล์คลาสเพื่อรองรับรูปแบบไฟล์คลาสใหม่ พูลถาวรในรูปแบบ CONSTANT_Dynamic แนวคิดของค่าคงที่ไดนามิกดูเหมือนเป็น oxymoron แต่โดยพื้นฐานแล้วคุณสามารถคิดว่ามันเป็นค่าสุดท้ายใน Java 11 ค่าของค่าคงที่การรวมกลุ่มไม่ได้ถูกตั้งค่าในเวลาคอมไพล์ (ต่างจากค่าคงที่อื่น ๆ ) แต่ใช้บูตสแตรป วิธีการกำหนดค่า ณ เวลานำ ดังนั้นค่าจึงเป็นแบบไดนามิก แต่เนื่องจากค่าของมันถูกตั้งค่าเพียงครั้งเดียว ค่าจึงเป็นค่าคงที่เช่นกัน คุณลักษณะนี้มีจุดมุ่งหมายหลักสำหรับผู้ที่พัฒนาภาษาใหม่และคอมไพเลอร์ที่จะสร้างรหัสไบต์และไฟล์คลาสเป็นเอาต์พุตเพื่อรันบน JVM [315] ปรับปรุง Aarch64 Intrinsics JEP นี้เสนอโดยชุมชน Red Hat ขณะนี้ JVM สามารถใช้คำสั่งพิเศษเพิ่มเติมที่มีอยู่ในชุดคำสั่ง Arm 64 โดยเฉพาะอย่างยิ่ง สิ่งนี้จะช่วยปรับปรุงประสิทธิภาพของเมธอด sin ()และcos ()คลาสjava.lang.Math [318] Epsilon: นักเก็บขยะแบบไม่ต้องปฏิบัติ เช่นเดียวกับJEP 315คุณสามารถขอบคุณ Red Hat ที่แนะนำตัวเก็บขยะ Epsilon เอปซิลอนไม่ธรรมดาตรงที่มันไม่ได้เก็บขยะจริงๆ! เมื่อสร้างอ็อบเจ็กต์ใหม่ ระบบจะจัดสรรหน่วยความจำหากจำเป็น แต่จะไม่เรียกคืนพื้นที่ที่ครอบครองโดยอ็อบเจ็กต์ที่ไม่ได้ลงทะเบียน " ประเด็นคืออะไร? ", - คุณถาม. ปรากฎว่า “การเก็บขยะ” นี้มีประโยชน์สองประการ: log ()
  1. ก่อนอื่น ตัวรวบรวมขยะนี้ได้รับการออกแบบมาเพื่อให้แน่ใจว่าอัลกอริทึม GC ใหม่ได้รับการประเมินในแง่ของผลกระทบต่อประสิทธิภาพ แนวคิดคือการรันแอปพลิเคชันตัวอย่างด้วย Epsilon และสร้างชุดเมตริก เปิดใช้งานอัลกอริธึมการรวบรวมขยะใหม่ ดำเนินการทดสอบเดียวกัน จากนั้นจึงเปรียบเทียบผลลัพธ์

  2. สำหรับงานที่สั้นมาก (ลองนึกถึงฟังก์ชันไร้เซิร์ฟเวอร์ในระบบคลาวด์) ซึ่งคุณสามารถรับประกันได้ว่าคุณจะไม่เกินหน่วยความจำที่จัดสรรให้กับฮีป สิ่งนี้สามารถปรับปรุงประสิทธิภาพโดยกำจัดค่าใช้จ่าย (รวมถึงการรวบรวมสถิติที่จำเป็นในการตัดสินใจว่าจะรันตัวรวบรวมหรือไม่) ในโค้ดของแอปพลิเคชัน หากพื้นที่ฮีปหมด JVM อาจถูกกำหนดค่าไม่ถูกต้องด้วยวิธีใดวิธีหนึ่งจากสามวิธี:
    • ปกติเรียกว่าOutOfMemoryError.
    • ดำเนินการรีเซ็ตฮีป
    • ฮาร์ดไดรฟ์ JVM ล้มเหลวและอาจทำงานอื่นอยู่ (เช่น การเริ่มดีบักเกอร์)
[328]: เครื่องบันทึกการบิน Flight Recorderเป็นเฟรมเวิร์กการรับข้อมูลระดับต่ำสำหรับ JVM ก่อน JDK 11 คุณลักษณะนี้เป็นคุณลักษณะเชิงพาณิชย์ในไบนารี Oracle JDK ขณะนี้ Oracle กำลังขจัดความแตกต่างด้านการทำงานระหว่าง Oracle JDK และหนึ่งบิลด์จาก OpenJDK นี่คือสิ่งที่ Flight Recorderทำ:
  • จัดเตรียม API สำหรับการผลิตและใช้ข้อมูลเป็นเหตุการณ์
  • จัดเตรียมกลไกบัฟเฟอร์และรูปแบบข้อมูลไบนารี
  • อนุญาตให้ปรับแต่งและการกรองเหตุการณ์
  • จัดเตรียมกิจกรรมสำหรับไลบรารี OS, JVM HotSpot และ JDK
มีสองโมดูลใหม่ที่นี่: jdk.jfrและjdk.management.jfr [329] อัลกอริธึมการเข้ารหัส ChaCha20 และ Poly1305 JEP นี้เกี่ยวกับการอัปเดตรหัสที่ JDK ใช้ กรณีนี้ใช้ อัลกอริธึมการเข้ารหัส ChaCha20และChaCha20-Poly1305ตามที่ระบุไว้ใน RFC 7539 ChaCha20เป็นรหัสสตรีมที่ค่อนข้างใหม่ซึ่งสามารถแทนที่ รหัส RC4 ที่เก่ากว่าและไม่ปลอดภัย ได้ [333] ZGC: ตัวรวบรวมขยะที่มีความหน่วงต่ำที่ปรับขนาดได้ ตัวรวบรวมขยะที่มีความหน่วงต่ำแบบทดลองที่ปรับขนาดได้ ออกแบบมาเพื่อใช้กับแอปพลิเคชันที่ต้องการฮีปขนาดใหญ่ (หลายกิกะไบต์) และมีเวลาแฝงต่ำ โดยจะใช้ฮีปรุ่นเดียวและรวบรวมขยะส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด) ทำงานในเวลาเดียวกันกับแอปพลิเคชัน [332] Transport Layer Security (TLS) 1.3 TLS 1.3 (RFC 8446)เป็นแพตช์หลักของโปรโตคอลความปลอดภัยของเลเยอร์การขนส่ง TLS ที่ให้การปรับปรุงความปลอดภัยและประสิทธิภาพอย่างมีนัยสำคัญมากกว่าเวอร์ชันก่อนหน้า ขณะนี้ JDK รองรับเวอร์ชันโปรโตคอลนี้แล้ว เนื้อหานี้อ้างอิงจากบทความของSimon Ritterและเอกสารประกอบอย่างเป็นทางการ
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION