หลังจากหกเดือนของการพัฒนา Oracle ได้เผยแพร่แพลตฟอร์ม Java SE 23 (แพลตฟอร์ม Java, Standard Edition 23) ซึ่งใช้โครงการโอเพ่นซอร์ส OpenJDK เป็นการดำเนินการอ้างอิง ยกเว้นการลบคุณลักษณะที่ล้าสมัยบางอย่างออก Java SE 23 ยังคงรักษาความเข้ากันได้แบบย้อนหลังกับแพลตฟอร์ม Java รุ่นก่อนหน้า - โปรเจ็กต์ Java ที่เขียนไว้ก่อนหน้านี้ส่วนใหญ่จะทำงานได้โดยไม่มีการเปลี่ยนแปลงเมื่อทำงานภายใต้เวอร์ชันใหม่ บิลด์ที่พร้อมติดตั้งของ Java SE 22 (JDK, JRE และ Server JRE) เตรียมไว้สำหรับ Linux (x86_64, AArch64), Windows (x86_64) และ macOS (x86_64, AArch64) พัฒนาโดยโครงการ OpenJDK การใช้งานอ้างอิง Java 23 นั้นเป็นโอเพ่นซอร์สอย่างสมบูรณ์ภายใต้ลิขสิทธิ์ GPLv2 โดยมีข้อยกเว้น GNU ClassPath ที่อนุญาตการลิงก์แบบไดนามิกกับผลิตภัณฑ์เชิงพาณิชย์
Java SE 23 จัดว่าเป็นรุ่นสนับสนุนปกติและจะยังคงรับการอัปเดตต่อไปจนกว่าจะมีรุ่นถัดไป สาขาการสนับสนุนระยะยาว (LTS) ควรเป็น Java SE 21 หรือ Java SE 17 ซึ่งจะได้รับการอัปเดตจนถึงปี 2031 และ 2029 ตามลำดับ (โดยทั่วไปจะพร้อมใช้งานจนถึงปี 2028 และ 2026) การสนับสนุนเพิ่มเติมสำหรับสาขา LTS ของ Java SE 8 จะคงอยู่จนถึงปี 2030 และ Java SE 11 จนถึงปี 2032
ในบรรดา 23 นวัตกรรมที่นำเสนอใน Java SE:
- โหมดกำเนิดการทำงานของตัวรวบรวมขยะ ZGC (Generation Z Garbage Collector) ถูกเปิดใช้งานตามค่าเริ่มต้น โดยใช้การประมวลผลวัตถุ "เก่า" และ "เด็ก" แยกกัน ซึ่งจะเพิ่มประสิทธิภาพในการทำความสะอาดวัตถุที่สร้างขึ้นล่าสุดด้วยอายุการใช้งานสั้น การใช้ Generational ZGC ช่วยลดความเสี่ยงที่ระบบจะหยุดทำงานระหว่างการจัดสรรทรัพยากร ลดภาระของ CPU และการใช้หน่วยความจำระหว่างการรวบรวมขยะ การทดสอบ Generational ZGC ด้วย Apache Cassandra 4 แสดงให้เห็นปริมาณงานเพิ่มขึ้น 4 เท่าด้วยขนาดฮีปคงที่ และขนาดฮีปลดลงหนึ่งในสี่ด้วยปริมาณงานคงที่
- JavaDoc ได้เพิ่มการรองรับการใช้ Markdown เพื่อจัดทำโค้ดในความคิดเห็น ซึ่งสามารถใช้แทนการผสมแท็ก HTML และ JavaDoc @ ได้

- กลไกการจับคู่รูปแบบได้รับการปรับปรุงด้วยการสนับสนุนเบื้องต้นสำหรับการใช้ประเภทดั้งเดิม (int, byte, char และประเภทพื้นฐานที่ไม่ใช่อ็อบเจ็กต์) ในเทมเพลตทุกประเภท ในคำสั่ง "instanceof" และในบล็อก "switch" สวิตช์ (x.getStatus()) { กรณีที่ 0 -> “โอเค”; กรณีที่ 1 -> “คำเตือน”; กรณีที่ 2 -> “ข้อผิดพลาด”; กรณี int i -> "สถานะที่ไม่รู้จัก:" + i; } ถ้า (i อินสแตนซ์ของไบต์ b) { … b … }
- เพิ่มการสนับสนุนเบื้องต้นสำหรับการใช้คำสั่ง "นำเข้าโมดูล M" เดียวเพื่อนำเข้าแพ็คเกจทั้งหมดที่ส่งออกโดยโมดูลที่ระบุในครั้งเดียว การเปลี่ยนแปลงนี้ช่วยลดความยุ่งยากในการใช้ไลบรารีโมดูลาร์ซ้ำได้อย่างมาก ทำให้คุณสามารถรวมไลบรารีและคลาสต่างๆ ได้โดยไม่ต้องระบุตำแหน่งในลำดับชั้นของแพ็กเกจ ตัวอย่างเช่น การระบุ “นำเข้าโมดูล java.base” จะนำเข้าแพ็คเกจทั้งหมด 54 แพ็คเกจที่รวมอยู่ในโมดูล java.base ซึ่งก่อนหน้านี้จำเป็นต้องกล่าวถึงแยกต่างหาก (“นำเข้า java.io.*”, “นำเข้า java.util.* ” เป็นต้น)
มีการเสนอการใช้งานเบื้องต้นครั้งที่สองของ Class-File API สำหรับการแยกวิเคราะห์ การสร้าง และการแปลงไฟล์คลาส Java ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse (ไบต์); ไบต์[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue() startWith("debug"))) { classBuilder.with(ce);
- ตัวอย่างที่แปดของ Vector API มีฟังก์ชันสำหรับการคำนวณเวกเตอร์ที่ดำเนินการโดยใช้คำสั่งเวกเตอร์บนโปรเซสเซอร์ x86_64 และ AArch64 และอนุญาตให้ดำเนินการพร้อมกันกับหลายค่า (SIMD) ต่างจากความสามารถที่มีในคอมไพเลอร์ HotSpot JIT สำหรับการทำเวคเตอร์อัตโนมัติของการดำเนินการสเกลาร์ API ใหม่ทำให้สามารถควบคุมการทำเวคเตอร์สำหรับการประมวลผลข้อมูลแบบขนานได้อย่างชัดเจน
- เพิ่มเมธอดรูปแบบ printf, readPassword และ readLine ให้กับคลาส java.io.Console เพื่อจัดรูปแบบ แสดง และอ่านข้อความตามสถานที่ที่เลือก System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 ใหม่
- มีการเพิ่มการใช้งานการแสดงตัวอย่างครั้งที่สองของ Stream API แบบขยาย ซึ่งรองรับการกำหนดการดำเนินการระดับกลางของคุณเอง ซึ่งอาจมีประโยชน์ในกรณีที่การดำเนินการระดับกลางในตัวที่มีอยู่ไม่เพียงพอสำหรับการแปลงข้อมูลที่ต้องการ ตัวจัดการดั้งเดิมเชื่อมต่อกันโดยใช้การดำเนินการระดับกลางใหม่ Stream::gather(Gatherer) ซึ่งประมวลผลองค์ประกอบสตรีมโดยใช้ตัวจัดการที่ผู้ใช้ระบุกับองค์ประกอบเหล่านั้น jshell> Stream.of (1,2,3,4,5,6,7,8,9).gather (WindowFixed ใหม่ (3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- เพิ่มการใช้งานเบื้องต้นครั้งที่สามของคลาสที่ประกาศโดยปริยายและอินสแตนซ์ที่ไม่มีชื่อของวิธีการ "หลัก" ซึ่งสามารถเลิกใช้การประกาศสาธารณะ/แบบคงที่ ส่งผ่านอาร์เรย์ของอาร์กิวเมนต์ และเอนทิตีอื่น ๆ ที่เกี่ยวข้องกับการประกาศคลาส // เป็น HelloWorld คลาสสาธารณะ { โมฆะสาธารณะคงที่ main (String [] args) { System.out.println ("สวัสดีชาวโลก!"); } } // ตอนนี้คุณสามารถถือเป็นโมฆะ main() { System.out.println("Hello, World!"); -
- เพิ่มการแสดงตัวอย่างที่สองของคุณสมบัติที่ช่วยให้คอนสตรัคเตอร์สามารถระบุนิพจน์ก่อนที่จะเรียก super(...) ซึ่งใช้ในการเรียกคอนสตรัคเตอร์ของคลาสพาเรนต์อย่างชัดเจนจากคอนสตรัคเตอร์ของคลาสที่สืบทอดมา หากนิพจน์เหล่านั้นไม่ได้อ้างถึงอินสแตนซ์ที่สร้างโดยคอนสตรัคเตอร์ คลาสด้านนอก { เป็นโมฆะสวัสดี () { System.out.println ("สวัสดี"); } คลาส Inner { Inner() { สวัสดี (); ซุปเปอร์(); -
- เพิ่มการใช้งานการแสดงตัวอย่างครั้งที่สามของค่าขอบเขต ซึ่งช่วยให้สามารถแชร์ข้อมูลที่ไม่เปลี่ยนรูปแบบข้ามเธรดและข้อมูลมีการแลกเปลี่ยนอย่างมีประสิทธิภาพระหว่างเธรดย่อย (ค่าได้รับการสืบทอด) ค่าที่กำหนดขอบเขตกำลังได้รับการพัฒนาเพื่อแทนที่กลไกตัวแปรเธรดภายใน และมีประสิทธิภาพมากขึ้นเมื่อใช้เธรดเสมือนจำนวนมาก (หลายพันหรือล้านเธรด) ข้อแตกต่างที่สำคัญระหว่างค่าที่กำหนดขอบเขตและตัวแปรภายในเธรดคือ ตัวแปรแรกจะถูกเขียนเพียงครั้งเดียว ไม่สามารถเปลี่ยนแปลงได้ในอนาคต และจะยังคงใช้ได้เฉพาะในช่วงระยะเวลาของการดำเนินการของเธรดเท่านั้น
- มีการเสนอการแสดงตัวอย่าง Structured Concurrency API ครั้งที่สามสำหรับการทดสอบ ทำให้การพัฒนาแอปพลิเคชันแบบมัลติเธรดง่ายขึ้นโดยการประมวลผลงานหลายงานที่ทำงานในเธรดที่แตกต่างกันเป็นบล็อกเดียว
- วิธีการเข้าถึงหน่วยความจำภายนอก (ภายนอก JVM) ที่ได้รับจากคลาส sun.misc.Unsafe เลิกใช้แล้วและกำหนดเวลาในการลบออก หากต้องการเข้าถึงหน่วยความจำนอกฮีปและโต้ตอบกับโค้ดภายนอก ขอแนะนำให้ใช้ VarHandle API และ FFM (Foreign Function & Memory) API
นอกจากนี้เรายังสามารถสังเกตการเผยแพร่การอัปเดตแพลตฟอร์มสำหรับการสร้างแอปพลิเคชันด้วยอินเทอร์เฟซกราฟิก JavaFX 23 และการรวมคอมไพเลอร์ GraalVM JIT ใน Oracle JDK 23 หลัก
นอกจากนี้ยังนำเสนอเป็น GraalVM เครื่องเสมือนสากลรุ่นใหม่ซึ่งรองรับการใช้งานแอปพลิเคชันใน JavaScript (Node.js), Python, Ruby, R, ภาษาใด ๆ สำหรับ JVM (Java, Scala, Clojure, Kotlin) และภาษา ซึ่งสามารถสร้างบิตโค้ด LLVM ได้ (C , C++, Rust) นอกเหนือจากการรองรับ JDK 23 แล้ว เวอร์ชันใหม่ยังปรับการใช้หน่วยความจำและขนาดของโค้ดปฏิบัติการให้เหมาะสม และให้การสนับสนุนอย่างเต็มที่สำหรับเครื่องมือสำหรับการฝัง Python และ WebAssembly ลงในโค้ด Java โดยใช้การคอมไพล์ JIT
ที่มา: opennet.ru

