
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