นากกายสีมิ้นต์ติ๊กช่องฟิลด์ให้ครบก่อนเปิดประตูอ็อบเจ็กต์บนโต๊ะมิ้นต์

JEP 539 Strict Field Initialization (Preview): ฟิลด์ที่ต้องตั้งก่อนอ่าน

น้องกายEngineering

ฟิลด์ Java ที่ไม่ได้ตั้งค่าจะได้ศูนย์/null ซึ่งกันหน่วยความจำไม่ถูก init แต่บางครั้งค่า default ถูกนำไปใช้เป็นข้อมูลจริงโดยไม่ตั้งใจ

JEP 539 สถานะ Integrated สำหรับ JDK 28 เป็นพรีวิวฝั่ง JVM เพิ่มฟิลด์ strictly-initialized ที่คอมไพเลอร์ติดธง ACC_STRICT_INIT

สัญญาที่ JVM บังคับ

สำหรับสแตติกฟิลด์แบบเข้มงวด

  • อ่านก่อนตั้งไม่ได้
  • ต้องตั้งให้ครบก่อนคลาส init เสร็จ
  • ถ้าเป็น final ห้ามเขียนหลังถูกอ่านระหว่าง larval

สำหรับอินสแตนซ์ฟิลด์แบบเข้มงวด

  • ต้องตั้งก่อนเรียก super() constructor
  • อ่านก่อนหน้านั้นไม่ได้ผ่านการตรวจของ verifier
  • final แบบเข้มงวดห้าม mutate หลังเข้า late-larval รวมถึง deep reflection

ผลคือไม่เห็น 0/null จากฟิลด์เหล่านี้ และ final ที่เข้มงวดอ่านได้ค่าเดิมเสมอ ซึ่งเป็นฐานของ value classes ใน JEP 401

สิ่งที่ไม่ได้ทำ

  • ไม่เพิ่มคีย์เวิร์ดภาษา Java สำหรับฟิลด์ในรอบนี้
  • ไม่บังคับโค้ดเก่าให้เป็น strict ผ่าน javac อัตโนมัติ
  • คลาสที่มีฟิลด์แบบนี้ deserialize แบบเดิมไม่ได้ ต้องใช้ writeReplace/readResolve หรือรอเฟรมเวิร์ก serialize รุ่นใหม่

Recap

  • JEP 539 เป็นเครื่องมือ JVM สำหรับคอมไพเลอร์ ไม่ใช่สวิตช์ที่นักพัฒนาเปิดทีละฟิลด์ในซอร์สวันนี้
  • value class พึ่งกลไกนี้
  • อย่าพึ่ง deep reflection แก้ final แบบเข้มงวด
  • อ่านตัวอย่างวงจร init คลาสใน JEP ก่อนดีบัก NPE แปลกๆ จาก static order