การเปิดตัวแพลตฟอร์ม Java SE 22 และการใช้งานอ้างอิงแบบเปิด OpenJDK 22

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

Java SE 22 จัดว่าเป็นรุ่นสนับสนุนปกติและจะยังคงได้รับการอัปเดตต่อไปจนกว่าจะมีรุ่นถัดไป สาขาการสนับสนุนระยะยาว (LTS) ควรเป็น Java SE 21 หรือ Java SE 17 ซึ่งจะได้รับการอัปเดตจนถึงปี 2031 และ 2029 ตามลำดับ (โดยทั่วไปจะพร้อมใช้งานจนถึงปี 2028 และ 2026) การสนับสนุนสาธารณะสำหรับสาขา LTS ของ Java SE 11 สิ้นสุดลงเมื่อเดือนกันยายนปีที่แล้ว แต่การสนับสนุนเพิ่มเติมจะดำเนินต่อไปจนถึงปี 2032 การสนับสนุนเพิ่มเติมสำหรับสาขา LTS ของ Java SE 8 จะดำเนินต่อไปจนถึงปี 2030

เราขอเตือนคุณว่าตั้งแต่การเปิดตัว Java 10 เป็นต้นไป โปรเจ็กต์ได้เปลี่ยนไปใช้กระบวนการพัฒนาใหม่ ซึ่งหมายถึงวงจรที่สั้นลงสำหรับการก่อตัวของรีลีสใหม่ ขณะนี้ฟังก์ชันการทำงานใหม่ได้รับการพัฒนาในสาขาหลักที่ได้รับการอัปเดตอย่างต่อเนื่อง ซึ่งรวมถึงการเปลี่ยนแปลงสำเร็จรูปและสาขาที่จะแตกแขนงทุก ๆ หกเดือนเพื่อรักษาเสถียรภาพของการเปิดตัวใหม่

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

  • ตัวรวบรวมขยะ G1 รองรับการปักหมุดขอบเขต ซึ่งช่วยให้คุณสามารถปักหมุดตำแหน่งของอ็อบเจ็กต์ Java ในหน่วยความจำได้ชั่วคราว เพื่อหลีกเลี่ยงไม่ให้ตัวรวบรวมขยะย้าย และเพื่อให้การอ้างอิงไปยังอ็อบเจ็กต์เหล่านี้สามารถส่งผ่านได้อย่างปลอดภัยระหว่าง Java และโค้ดแบบเนทีฟ การปักหมุดช่วยให้คุณลดเวลาแฝงและหลีกเลี่ยงการปิดใช้งานการรวบรวมขยะเมื่อดำเนินการขอบเขตสำคัญของ JNI (Java Native Interface) ด้วยโค้ดเนทีฟ (ในขณะที่ดำเนินการส่วนเหล่านี้ JVM ไม่ควรย้ายอ็อบเจ็กต์สำคัญที่เกี่ยวข้องกับส่วนเหล่านั้นเพื่อหลีกเลี่ยงสภาวะการแข่งขัน) การปักหมุดจะลบวัตถุที่สำคัญออกจากมุมมองของตัวรวบรวมขยะ ซึ่งสามารถดำเนินการทำความสะอาดพื้นที่ที่ไม่ได้ปักหมุดต่อไปได้
  • มีการเพิ่มคุณลักษณะเบื้องต้นเพื่อให้สามารถระบุนิพจน์ในตัวสร้างก่อนที่จะเรียก super(...) ซึ่งใช้ในการเรียกตัวสร้างคลาสพาเรนต์จากตัวสร้างคลาสที่สืบทอดมาอย่างชัดเจน หากนิพจน์เหล่านั้นไม่ได้อ้างถึงอินสแตนซ์ที่สร้างโดยตัวสร้างคลาส คลาสด้านนอก { เป็นโมฆะสวัสดี () { System.out.println ("สวัสดี"); } คลาส Inner { Inner() { สวัสดี (); ซุปเปอร์(); -
  • FFM (Foreign Function & Memory) API ได้รับความเสถียร ทำให้สามารถโต้ตอบโปรแกรม Java กับโค้ดและข้อมูลภายนอกได้โดยการเรียกใช้ฟังก์ชันจากไลบรารีภายนอกและเข้าถึงหน่วยความจำภายนอก JVM โดยไม่ต้องใช้ JNI (Java Native Interface)
  • เปิดใช้งานการรองรับตัวแปรที่ไม่มีชื่อและการจับคู่รูปแบบแล้ว - แทนที่จะใช้ตัวแปรและรูปแบบที่ไม่ได้ใช้แต่จำเป็นเมื่อทำการเรียก ตอนนี้คุณสามารถระบุอักขระ "_" ได้แล้ว // เป็น String pageName = switch (หน้า) { case GitHubIssuePage (var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; - // ตอนนี้คุณสามารถ String pageName = switch (หน้า) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; -
  • มีการเสนอการใช้งาน 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); } } });
  • ยูทิลิตี้ java ให้ความสามารถในการรันโปรแกรม Java ซึ่งจัดทำในรูปแบบของไฟล์โค้ดหลายไฟล์หรือไลบรารีคลาสที่คอมไพล์แล้วโดยไม่ต้องคอมไพล์ไฟล์เหล่านี้แยกกันและไม่ต้องกำหนดค่าระบบบิลด์ คุณสมบัติใหม่ช่วยให้รันโปรแกรมได้ง่ายขึ้นโดยแยกโค้ดของคลาสต่าง ๆ ออกเป็นไฟล์แยกกัน Prog.java: คลาส Prog { โมฆะสาธารณะคงหลัก (สตริง [] args) { Helper.run (); } } Helper.java: class Helper { static void run() { System.out.println("Hello!"); -

    ตัวอย่างเช่น หากต้องการรันโปรแกรมที่ประกอบด้วยสองไฟล์ "Prog.java" และ "Helper.java" ตอนนี้ก็เพียงพอที่จะรัน "java Prog.java" ซึ่งจะคอมไพล์คลาส Prog กำหนดการอ้างอิงถึงคลาส Helper ค้นหาและคอมไพล์ไฟล์ Helper.java และเรียกเมธอดหลัก

  • เพิ่มการใช้งานเบื้องต้นครั้งที่สองของเทมเพลตสตริง ซึ่งนำไปใช้นอกเหนือจากตัวอักษรสตริงและบล็อกข้อความ เทมเพลตสตริงช่วยให้คุณสามารถรวมข้อความเข้ากับนิพจน์และตัวแปรจากการคำนวณได้โดยไม่ต้องใช้ตัวดำเนินการ + การแทนที่นิพจน์จะดำเนินการโดยใช้การแทนที่ \{..} และสามารถเชื่อมต่อตัวจัดการพิเศษเพื่อตรวจสอบความถูกต้องของค่าที่ถูกแทนที่ได้ ตัวอย่างเช่น กลไก SQL จะตรวจสอบค่าที่ถูกแทนที่ในโค้ด SQL และส่งคืนออบเจ็กต์ java.sql.Statement เป็นเอาต์พุต ในขณะที่โปรเซสเซอร์ JSON จะตรวจสอบความถูกต้องของการทดแทน JSON และส่งคืน JsonNode ข้อความค้นหา = "SELECT * จากบุคคล p WHERE p" + คุณสมบัติ + " = '" + ค่า + "'"; // เป็นคำสั่ง query = SQL"""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // กลายเป็น
  • มีการเพิ่มการแสดงตัวอย่างครั้งที่เจ็ดของ Vector API โดยมีฟังก์ชันสำหรับการคำนวณเวกเตอร์ที่ดำเนินการโดยใช้คำสั่งเวกเตอร์บนโปรเซสเซอร์ x86_64 และ AArch64 และอนุญาตให้ดำเนินการพร้อมกันกับหลายค่า (SIMD) ต่างจากความสามารถที่มีในคอมไพเลอร์ HotSpot JIT สำหรับการทำเวคเตอร์อัตโนมัติของการดำเนินการสเกลาร์ API ใหม่ทำให้สามารถควบคุมการทำเวคเตอร์สำหรับการประมวลผลข้อมูลแบบขนานได้อย่างชัดเจน
  • มีการเพิ่มการใช้งานเบื้องต้นของ 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]]
  • มีการเสนอเวอร์ชันที่สองของ API ทดลองสำหรับ Structured Concurrency สำหรับการทดสอบ ซึ่งช่วยให้การพัฒนาแอปพลิเคชันแบบมัลติเธรดง่ายขึ้นโดยการประมวลผลงานหลายอย่างที่ดำเนินการในเธรดที่แตกต่างกันเป็นบล็อกเดียว
  • เพิ่มการใช้งานเบื้องต้นครั้งที่สองของคลาสที่ประกาศโดยปริยายและอินสแตนซ์ที่ไม่มีชื่อของวิธีการ "หลัก" ซึ่งสามารถเลิกใช้การประกาศสาธารณะ/แบบคงที่ การส่งผ่านอาเรย์ของอาร์กิวเมนต์ และเอนทิตีอื่น ๆ ที่เกี่ยวข้องกับการประกาศคลาส // เป็น HelloWorld ระดับสาธารณะ { โมฆะสาธารณะคงที่ main (String [] args) { System.out.println ("สวัสดีชาวโลก!"); } } // ตอนนี้คุณสามารถถือเป็นโมฆะ main() { System.out.println("Hello, World!"); -
  • เพิ่มการใช้งานการแสดงตัวอย่างครั้งที่สองของค่าขอบเขต ซึ่งช่วยให้สามารถแชร์ข้อมูลที่ไม่เปลี่ยนรูปแบบข้ามเธรดและข้อมูลมีการแลกเปลี่ยนอย่างมีประสิทธิภาพระหว่างเธรดย่อย (ค่าได้รับการสืบทอด) ค่าที่กำหนดขอบเขตกำลังได้รับการพัฒนาเพื่อแทนที่กลไกตัวแปรเธรดภายใน และมีประสิทธิภาพมากขึ้นเมื่อใช้เธรดเสมือนจำนวนมาก (พันหรือล้านเธรด) ข้อแตกต่างที่สำคัญระหว่างค่าที่กำหนดขอบเขตและตัวแปรภายในเธรดคือ ตัวแปรแรกจะถูกเขียนเพียงครั้งเดียว ไม่สามารถเปลี่ยนแปลงได้ในอนาคต และจะยังคงใช้ได้เฉพาะในช่วงระยะเวลาของการดำเนินการของเธรดเท่านั้น
  • ตัวรวบรวมขยะแบบขนานได้ปรับปรุงประสิทธิภาพเมื่อทำงานกับอาร์เรย์ของออบเจ็กต์ขนาดใหญ่ การเพิ่มประสิทธิภาพทำให้การทดสอบบางอย่างที่มีอาร์เรย์ของออบเจ็กต์ขนาดใหญ่เป็นไปได้ เพื่อลดความล่าช้าก่อนที่จะเริ่มค้นหาออบเจ็กต์ลง 20%

นอกจากนี้ คุณสามารถสังเกตการเผยแพร่การอัปเดตแพลตฟอร์มสำหรับการสร้างแอปพลิเคชันด้วยอินเทอร์เฟซกราฟิก JavaFX 22

ที่มา: opennet.ru

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