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

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

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

เพื่อเตรียมพร้อมสำหรับการเปิดตัวใหม่ การพัฒนาได้ย้ายจากระบบควบคุมเวอร์ชัน Mercurial ไปเป็น Git และแพลตฟอร์มการพัฒนาร่วมกันของ GitHub การย้ายข้อมูลคาดว่าจะปรับปรุงประสิทธิภาพของการดำเนินการพื้นที่เก็บข้อมูล เพิ่มประสิทธิภาพการจัดเก็บข้อมูล ให้การเข้าถึงการเปลี่ยนแปลงตลอดประวัติของโปรเจ็กต์ ปรับปรุงการสนับสนุนสำหรับการตรวจสอบโค้ด และเปิดใช้งาน API เพื่อทำให้เวิร์กโฟลว์เป็นแบบอัตโนมัติ นอกจากนี้ การใช้ Git และ GitHub ยังทำให้โปรเจ็กต์น่าสนใจยิ่งขึ้นสำหรับผู้เริ่มต้นและนักพัฒนาที่คุ้นเคยกับ Git

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

  • เพิ่มโมดูลทดลอง jdk.incubator.vector ด้วยการใช้ Vector API ซึ่งมีฟังก์ชันสำหรับการคำนวณเวกเตอร์ที่ดำเนินการโดยใช้คำสั่งเวกเตอร์บนโปรเซสเซอร์ x86_64 และ AArch64 และอนุญาตให้ดำเนินการพร้อมกันกับหลายค่า (SIMD) ตรงกันข้ามกับความสามารถที่มีในคอมไพเลอร์ HotSpot JIT สำหรับการทำเวคเตอร์อัตโนมัติของการดำเนินการสเกลาร์ API ใหม่ช่วยให้คุณควบคุมการทำเวคเตอร์สำหรับการประมวลผลข้อมูลแบบขนานได้อย่างชัดเจน
  • รหัส JDK และ VM HotSpot ที่เขียนด้วยภาษา C++ ได้รับอนุญาตให้ใช้คุณสมบัติที่แนะนำในข้อกำหนด C++14 ก่อนหน้านี้ อนุญาตให้ใช้มาตรฐาน C++98/03 ได้
  • ZGC (Z Garbage Collector) ซึ่งทำงานในโหมดพาสซีฟและลดความล่าช้าเนื่องจากการรวบรวมขยะให้มากที่สุด ได้เพิ่มความสามารถในการประมวลผลเธรดสแต็กแบบขนานโดยไม่ต้องหยุดเธรดแอปพลิเคชันชั่วคราว ขณะนี้ ZGC มีเพียงงานที่ต้องมีการระงับซึ่งมีความล่าช้าคงที่ โดยปกติจะไม่เกินสองสามร้อยไมโครวินาที
  • เพิ่มการรองรับซ็อกเก็ต Unix (AF_UNIX) ให้กับคลาส SocketChannel, ServerSocketChannel และ java.nio.channels
  • พอร์ตถูกนำมาใช้สำหรับการกระจาย Linux Alpine ด้วย musl ไลบรารี C มาตรฐาน ซึ่งเป็นที่นิยมในสภาพแวดล้อมสำหรับคอนเทนเนอร์ ไมโครเซอร์วิส คลาวด์ และระบบฝังตัว พอร์ตที่นำเสนอในสภาพแวดล้อมดังกล่าวช่วยให้คุณสามารถรันโปรแกรม Java ได้เหมือนกับแอปพลิเคชันทั่วไป นอกจากนี้ เมื่อใช้ jlink คุณสามารถลบโมดูลที่ไม่ได้ใช้ทั้งหมดและสร้างสภาพแวดล้อมขั้นต่ำที่เพียงพอที่จะเรียกใช้แอปพลิเคชัน ซึ่งช่วยให้คุณสร้างอิมเมจขนาดกะทัดรัดเฉพาะแอปพลิเคชันได้
  • มีการใช้กลไก Elastic Metaspace ซึ่งเพิ่มประสิทธิภาพการดำเนินการของการจัดสรรและการส่งคืนหน่วยความจำที่ครอบครองโดยข้อมูลเมตาของคลาส (metaspace) ใน JVM HotSpot การใช้ Elastic Metaspace ช่วยลดการกระจายตัวของหน่วยความจำ ลดโอเวอร์เฮดของตัวโหลดคลาส และยังมีประโยชน์ต่อประสิทธิภาพของแอปพลิเคชันเซิร์ฟเวอร์ที่ทำงานยาวนาน เนื่องจากการส่งคืนหน่วยความจำที่รวดเร็วขึ้นซึ่งครอบครองโดยข้อมูลเมตาของคลาสที่ไม่ได้ใช้ไปยังระบบปฏิบัติการ หากต้องการเลือกโหมดการเผยแพร่หน่วยความจำหลังจากยกเลิกการโหลดคลาสแล้ว จะมีการเสนอตัวเลือก “-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)”
  • มีการเพิ่มพอร์ต JDK สำหรับระบบ Windows ที่ทำงานบนฮาร์ดแวร์พร้อมโปรเซสเซอร์ที่ใช้สถาปัตยกรรม AArch64
  • มีการเสนอตัวอย่างที่สามของ Foreign-Memory Access API ซึ่งช่วยให้แอปพลิเคชัน Java สามารถเข้าถึงขอบเขตหน่วยความจำภายนอกฮีป Java ได้อย่างปลอดภัยและมีประสิทธิภาพโดยจัดการกับนามธรรม MemorySegment, MemoryAddress และ MemoryLayout ใหม่
  • มีการใช้ Foreign Linker API รุ่นทดลอง ซึ่งให้การเข้าถึงจาก Java ไปจนถึงโค้ดเนทีฟ เมื่อใช้งานร่วมกับ Foreign-Memory API แล้ว อินเทอร์เฟซการเขียนโปรแกรมใหม่จะทำให้การสร้าง Wrapper บนไลบรารีที่แบ่งใช้ทั่วไปทำได้ง่ายขึ้นมาก
  • เพิ่มยูทิลิตี้ jpackage ซึ่งช่วยให้คุณสร้างแพ็คเกจสำหรับแอปพลิเคชัน Java ที่มีอยู่ในตัวเอง ยูทิลิตี้นี้ใช้ javapackager จาก JavaFX และช่วยให้คุณสร้างแพ็คเกจในรูปแบบดั้งเดิมสำหรับแพลตฟอร์มต่างๆ (msi และ exe สำหรับ Windows, pkg และ dmg สำหรับ macOS, deb และ rpm สำหรับ Linux) แพ็คเกจรวมการขึ้นต่อกันที่จำเป็นทั้งหมด
  • การห่อหุ้มภายใน JDK อย่างเข้มงวดทั้งหมดจะถูกเปิดใช้งานตามค่าเริ่มต้น ยกเว้น API ที่สำคัญ เช่น sun.misc.Unsafe ค่าของตัวเลือก “--การเข้าถึงที่ผิดกฎหมาย” ตอนนี้ถูกตั้งค่าเป็น “ปฏิเสธ” แทนที่จะเป็น “อนุญาต” ตามค่าเริ่มต้น ซึ่งจะบล็อกความพยายามจากโค้ดในการเข้าถึงคลาส วิธีการ และฟิลด์ภายในส่วนใหญ่ หากต้องการข้ามข้อจำกัดนี้ ให้ใช้ตัวเลือก "-illegal-access=permit"
  • การใช้งานการจับคู่รูปแบบในตัวดำเนินการ “instanceof” ได้รับความเสถียร ซึ่งช่วยให้คุณกำหนดตัวแปรท้องถิ่นเพื่ออ้างอิงถึงค่าที่เลือกได้ทันที ตัวอย่างเช่น คุณสามารถเขียน “if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” ได้ทันทีโดยไม่ต้องกำหนด “String s = (String) obj” อย่างชัดเจน เคยเป็น: ถ้า (obj instanceof Group) { กลุ่มกลุ่ม = (กลุ่ม) obj; รายการ var = group.getEntries(); } ตอนนี้คุณสามารถทำได้โดยไม่ต้องกำหนด “Group group = (Group) obj”: if (obj instanceof Group group) { var entry = group.getEntries(); }
  • การใช้งานคีย์เวิร์ด "record" มีความเสถียร โดยให้รูปแบบที่กะทัดรัดสำหรับคำจำกัดความของคลาส ซึ่งช่วยลดความจำเป็นในการกำหนดวิธีการระดับต่ำต่างๆ อย่างชัดเจน เช่น เท่ากับ(), hashCode() และ toString() ในกรณีที่ข้อมูลถูกเก็บไว้ เฉพาะในสาขาซึ่งมันไม่เปลี่ยนแปลง เมื่อคลาสใช้การใช้งานมาตรฐานของเมธอดเท่ากับ(), hashCode() และ toString() ก็สามารถทำได้โดยไม่มีคำจำกัดความที่ชัดเจน: บันทึกสาธารณะ BankTransaction(LocalDate date, double amount, String description) {}

    การประกาศนี้จะเพิ่มการใช้งานเมธอดเท่ากับ(), hashCode() และ toString() โดยอัตโนมัติ นอกเหนือจากเมธอด Constructor และ Getter

  • ร่างที่สองถูกเสนอสำหรับคลาสและอินเทอร์เฟซที่ปิดผนึกซึ่งไม่สามารถใช้โดยคลาสและอินเทอร์เฟซอื่นเพื่อสืบทอด ขยาย หรือแทนที่การใช้งาน คลาสที่ปิดผนึกยังจัดให้มีวิธีการประกาศที่ชัดเจนมากขึ้นในการจำกัดการใช้ซูเปอร์คลาสมากกว่าตัวแก้ไขการเข้าถึง โดยยึดตามรายการคลาสย่อยที่อนุญาตให้ขยายอย่างชัดเจน แพ็คเกจ com.example.geometry; อนุญาตรูปร่างคลาสที่ปิดผนึกสาธารณะ com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

ที่มา: opennet.ru

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