การเปิดตัว Java SE 17

หลังจากหกเดือนของการพัฒนา Oracle ได้เปิดตัวแพลตฟอร์ม Java SE 17 (Java Platform, Standard Edition 17) ซึ่งใช้โครงการโอเพ่นซอร์ส OpenJDK เป็นการดำเนินการอ้างอิง ยกเว้นการลบฟีเจอร์ที่เลิกใช้แล้ว Java SE 17 จะรักษาความเข้ากันได้แบบย้อนหลังกับเวอร์ชันก่อนหน้าของแพลตฟอร์ม Java ซึ่งโปรเจ็กต์ Java ที่เขียนไว้ก่อนหน้านี้ส่วนใหญ่จะยังคงทำงานโดยไม่มีการแก้ไขเมื่อเรียกใช้ภายใต้เวอร์ชันใหม่ รุ่นที่ติดตั้งได้ของ Java SE 17 (JDK, JRE และ Server JRE) เตรียมไว้สำหรับ Linux (x86_64, AArch64), Windows (x86_64) และ macOS (x86_64, AArch64) การพัฒนาโดยโครงการ OpenJDK การใช้งานอ้างอิง Java 17 เป็นโอเพ่นซอร์สอย่างสมบูรณ์ภายใต้สิทธิ์ใช้งาน GPLv2 พร้อมข้อยกเว้น GNU ClassPath เพื่ออนุญาตการเชื่อมโยงแบบไดนามิกไปยังผลิตภัณฑ์เชิงพาณิชย์

Java SE 17 จัดเป็นรุ่น Long Term Support (LTS) ซึ่งจะได้รับการอัปเดตต่อไปจนถึงปี 2029 การอัปเดตสำหรับ Java 16 เหตุการณ์สำคัญก่อนหน้านี้ถูกยกเลิกแล้ว Java 11 สาขา LTS ก่อนหน้าจะได้รับการสนับสนุนจนถึงปี 2026 LTS รุ่นถัดไปมีกำหนดในเดือนกันยายน 2024 เราขอเตือนคุณว่าตั้งแต่การเปิดตัว Java 10 เป็นต้นไป โปรเจ็กต์ได้เปลี่ยนไปใช้กระบวนการพัฒนาใหม่ ซึ่งหมายถึงวงจรที่สั้นลงสำหรับการก่อตัวของรีลีสใหม่ ขณะนี้ฟังก์ชันการทำงานใหม่ได้รับการพัฒนาในสาขาหลักที่ได้รับการอัปเดตอย่างต่อเนื่อง ซึ่งรวมถึงการเปลี่ยนแปลงที่พร้อมใช้งานและสาขาที่จะแตกแขนงทุก ๆ หกเดือนเพื่อรักษาเสถียรภาพของการออกใหม่

คุณสมบัติใหม่ใน Java 17 รวมถึง:

  • มีการเสนอการใช้งานการจับคู่รูปแบบแบบทดลองในนิพจน์ "สวิตช์" ซึ่งอนุญาตให้ใช้ค่าที่ไม่แน่นอนในป้ายกำกับ "กรณี" แต่เป็นเทมเพลตที่ยืดหยุ่นซึ่งครอบคลุมชุดของค่าในคราวเดียวซึ่งก่อนหน้านี้จำเป็นต้องใช้ยุ่งยาก สายโซ่ของสำนวน "if...else" นอกจากนี้ “สวิตช์” ยังมีความสามารถในการจัดการค่า NULL วัตถุ o = 123L; รูปแบบสตริง = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); ค่าเริ่มต้น -> o.toString(); };
  • การสนับสนุนที่เสถียรสำหรับคลาสและอินเทอร์เฟซที่ปิดผนึก ซึ่งคลาสและอินเทอร์เฟซอื่นไม่สามารถใช้เพื่อสืบทอด ขยาย หรือแทนที่การใช้งาน คลาสที่ปิดผนึกยังจัดให้มีวิธีการประกาศที่ชัดเจนมากขึ้นในการจำกัดการใช้ซูเปอร์คลาสมากกว่าตัวแก้ไขการเข้าถึง โดยยึดตามรายการคลาสย่อยที่อนุญาตให้ขยายอย่างชัดเจน แพ็คเกจ com.example.geometry; อนุญาตรูปร่างคลาสที่ปิดผนึกสาธารณะ com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • มีการเสนอตัวอย่างที่สองของ Vector API ซึ่งมีฟังก์ชันสำหรับการคำนวณเวกเตอร์ที่ดำเนินการโดยใช้คำสั่งเวกเตอร์บนโปรเซสเซอร์ x86_64 และ AArch64 และอนุญาตให้ดำเนินการพร้อมกันกับหลายค่า (SIMD) ต่างจากความสามารถที่มีในคอมไพเลอร์ HotSpot JIT สำหรับการทำเวคเตอร์อัตโนมัติของการดำเนินการสเกลาร์ API ใหม่ทำให้สามารถควบคุมการทำเวคเตอร์สำหรับการประมวลผลข้อมูลแบบขนานได้อย่างชัดเจน
  • เพิ่มการแสดงตัวอย่างของ Foreign Function & Memory API ซึ่งอนุญาตให้แอปพลิเคชันโต้ตอบกับโค้ดและข้อมูลภายนอกรันไทม์ Java API ใหม่ช่วยให้คุณเรียกใช้ฟังก์ชันที่ไม่ใช่ JVM ได้อย่างมีประสิทธิภาพ และเข้าถึงหน่วยความจำที่ไม่ได้จัดการโดย JVM ตัวอย่างเช่น คุณสามารถเรียกใช้ฟังก์ชันจากไลบรารีที่แบ่งใช้ภายนอกและเข้าถึงข้อมูลกระบวนการได้โดยไม่ต้องใช้ JNI
  • เอ็นจิ้นการเรนเดอร์ macOS ที่ขับเคลื่อน Java 2D API ซึ่งจะขับเคลื่อน Swing API ตามลำดับ ได้รับการปรับใช้ให้ใช้ Metal Graphics API แพลตฟอร์ม macOS ยังคงใช้ OpenGL ตามค่าเริ่มต้น และการเปิดใช้งานการรองรับ Metal จำเป็นต้องมีการตั้งค่า "-Dsun.java2d.metal=true" และอย่างน้อยก็ใช้งาน macOS 10.14.x
  • เพิ่มพอร์ตสำหรับแพลตฟอร์ม macOS/AArch64 (คอมพิวเตอร์ Apple ที่ใช้ชิป Apple M1 ใหม่) คุณสมบัติพิเศษของพอร์ตคือการรองรับกลไกการป้องกันหน่วยความจำ W^X (Write XOR Execute) ซึ่งหน้าหน่วยความจำไม่สามารถเข้าถึงการเขียนและดำเนินการพร้อมกันได้ (โค้ดสามารถดำเนินการได้หลังจากปิดใช้งานการเขียนแล้วเท่านั้น และการเขียนไปยังเพจหน่วยความจำสามารถทำได้หลังจากปิดใช้งานการดำเนินการแล้วเท่านั้น)
  • เปลี่ยนกลับไปใช้เฉพาะซีแมนทิกส์ strictfp สำหรับนิพจน์จุดลอยตัว การสนับสนุนซีแมนทิกส์ "เริ่มต้น" ที่มีให้ตั้งแต่การเปิดตัว Java 1.2 ได้ถูกยกเลิก รวมถึงการลดความซับซ้อนในการทำงานบนระบบที่มีตัวประมวลผลร่วมทางคณิตศาสตร์ x87 ที่เก่ามาก (หลังจากการถือกำเนิดของคำสั่ง SSE2 ความต้องการซีแมนทิกส์เพิ่มเติมก็หายไป)
  • มีการนำอินเทอร์เฟซประเภทใหม่ไปยังตัวสร้างตัวเลขสุ่มเทียมมาใช้ และมีการนำอัลกอริธึมเพิ่มเติมเพื่อสร้างตัวเลขสุ่มที่ดีขึ้น แอปพลิเคชันจะได้รับโอกาสในการเลือกอัลกอริธึมสำหรับสร้างตัวเลขสุ่มเทียม ปรับปรุงการสนับสนุนสำหรับการสร้างสตรีมออบเจ็กต์แบบสุ่ม
  • บังคับใช้การห่อหุ้มภายใน JDK ทั้งหมดอย่างเข้มงวด ยกเว้น API ที่สำคัญ เช่น sun.misc.Unsafe การห่อหุ้มที่เข้มงวดจะบล็อกความพยายามจากโค้ดในการเข้าถึงคลาส วิธีการ และฟิลด์ภายใน ก่อนหน้านี้ โหมดการห่อหุ้มที่เข้มงวดสามารถปิดใช้งานได้โดยใช้ตัวเลือก "--illegal-access=permit" แต่ตอนนี้เลิกใช้งานแล้ว แอปพลิเคชันที่ต้องการเข้าถึงคลาส วิธีการ และฟิลด์ภายในควรกำหนดอย่างชัดเจนโดยใช้ตัวเลือก --add-opens หรือแอตทริบิวต์ Add-Opens ในไฟล์ Manifest
  • แอปพลิเคชันได้รับความสามารถในการกำหนดตัวกรองการดีซีเรียลไลซ์ข้อมูล ซึ่งสามารถเลือกตามบริบทและเลือกแบบไดนามิกตามการดำเนินการดีซีเรียลไลเซชันเฉพาะ ตัวกรองที่ระบุใช้ได้กับเครื่องเสมือนทั้งหมด (ทั่วทั้ง JVM) เช่น ครอบคลุมไม่เพียงแต่ตัวแอปพลิเคชันเท่านั้น แต่ยังรวมถึงไลบรารีบุคคลที่สามที่ใช้ในแอปพลิเคชันด้วย
  • Swing ได้เพิ่มเมธอด javax.swing.filechooser.FileSystemView.getSystemIcon เพื่อโหลดไอคอนขนาดใหญ่เพื่อปรับปรุง UI บนหน้าจอ High DPI
  • java.net.DatagramSocket API ให้การสนับสนุนการเชื่อมต่อกับกลุ่ม Multicast โดยไม่จำเป็นต้องใช้ java.net.MulticastSocket API แยกต่างหาก
  • ยูทิลิตี้ IGV (Ideal Graph Visualizer) ได้รับการปรับปรุง โดยให้การแสดงภาพเชิงโต้ตอบของการแสดงโค้ดระดับกลางในคอมไพเลอร์ HotSpot VM C2 JIT
  • ใน JavaDoc โดยการเปรียบเทียบกับคอมไพลเลอร์ javac เมื่อมีข้อผิดพลาดถูกส่งออก หมายเลขของบรรทัดที่มีปัญหาในไฟล์ต้นฉบับและตำแหน่งของข้อผิดพลาดจะถูกระบุในขณะนี้
  • เพิ่มคุณสมบัติ Native.encoding ซึ่งสะท้อนถึงชื่อของการเข้ารหัสอักขระระบบ (UTF-8, koi8-r, cp1251 ฯลฯ )
  • เพิ่มอินเทอร์เฟซ java.time.InstantSource เพื่อให้สามารถจัดการเวลาได้โดยไม่ต้องอ้างอิงถึงโซนเวลา
  • เพิ่ม java.util.HexFormat API สำหรับการแปลงเป็นตัวแทนเลขฐานสิบหกและในทางกลับกัน
  • มีการเพิ่มโหมด blackhole ให้กับคอมไพเลอร์ ซึ่งจะปิดใช้งานการดำเนินการกำจัดโค้ดที่ไม่ทำงาน ซึ่งสามารถนำมาใช้เมื่อทำการทดสอบประสิทธิภาพ
  • เพิ่มตัวเลือก “-Xlog:async” ให้กับรันไทม์เพื่อบันทึกบันทึกในโหมดอะซิงโครนัส
  • เมื่อสร้างการเชื่อมต่อที่ปลอดภัย TLS 1.3 จะถูกเปิดใช้งานตามค่าเริ่มต้น (ก่อนหน้านี้ใช้ TLS 1.2)
  • Applet API ที่ล้าสมัยที่ประกาศไว้ก่อนหน้านี้ (java.applet.Applet*, javax.swing.JApplet) ซึ่งใช้ในการรันแอปพลิเคชัน Java ในเบราว์เซอร์ ได้ถูกย้ายไปยังหมวดหมู่ของกำหนดไว้สำหรับการลบออก (ความเกี่ยวข้องหายไปหลังจากสิ้นสุดการสนับสนุน สำหรับปลั๊กอิน Java สำหรับเบราว์เซอร์)
  • Security Manager ซึ่งสูญเสียความเกี่ยวข้องไปนานแล้วและกลายเป็นว่าไม่มีการอ้างสิทธิ์หลังจากสิ้นสุดการสนับสนุนปลั๊กอินของเบราว์เซอร์ ได้ถูกย้ายไปยังหมวดหมู่ที่มีกำหนดนำออก
  • กลไกการเปิดใช้งาน RMI ได้ถูกลบออกไปแล้ว ซึ่งล้าสมัย และตกชั้นไปอยู่ในหมวดหมู่ของตัวเลือกใน Java 8 และแทบไม่เคยถูกนำมาใช้ในทางปฏิบัติสมัยใหม่เลย
  • คอมไพเลอร์ทดลองที่รองรับ JIT (ทันเวลาพอดี) สำหรับการคอมไพล์โค้ด Java แบบไดนามิกสำหรับ HotSpot JVM รวมถึงโหมดของการคอมไพล์ที่คาดหวัง (AOT ล่วงหน้า) ของคลาสลงในโค้ดเครื่องก่อนที่จะเริ่มเครื่องเสมือน ได้ถูกลบออกจาก SDK แล้ว คอมไพเลอร์เขียนด้วยภาษา Java และอิงตามงานของโครงการ Graal มีข้อสังเกตว่าการบำรุงรักษาคอมไพเลอร์ต้องใช้แรงงานจำนวนมากซึ่งไม่สมเหตุสมผลเมื่อไม่มีความต้องการจากนักพัฒนา

ที่มา: opennet.ru

เพิ่มความคิดเห็น