ข้าม​ไป​ยัง​เนื้อหา

preview มี​ราคา และ​ราคา​นั้น​วัด​ได้

บท​ที่ 1 บอก​ว่า​มี​สอง feature ที่​ยัง​เป็น preview ใน 25

บท​นี้​ตอบ​คำถาม​ถัด​ไป · รับ​มา​ใช้​แล้ว​จ่าย​อะไร และ​คำ​ตอบ​ไม่ใช่​ความ​รู้สึก

ทดลอง​สอง​บรรทัด แล้ว​อ่าน​สิ่ง​ที่ JVM ตอบ

Terminal window
javac --release 25 --enable-preview -d out F.java
java -cp out F
Preview features are not enabled for F (class file version 69.65535). Try running with '--enable-preview'

บรรทัด​เดียว​จริงๆ · ยก​มา​ทั้ง​บรรทัด​โดย​ไม่​ตัด เพราะ​เลข​ใน​วงเล็บ​คือ​ส่วน​ที่​สำคัญ​ที่สุด

JVM ไม่​ได้​อ่าน code ของ​คุณ​แล้ว​ตัดสิน​ใจ · มัน​อ่าน​หัว​ของ class file แล้ว​ปฏิเสธ​ทันที

class file versionclass file versionเลข​สอง​ส่วน​ที่​หัว class file บอก​ว่า​แปล​ด้วย​รุ่น​ไหน · ส่วน​รอง​เป็น `65535` เมื่อ class นั้น​ถูก​แปล​ด้วย​ธง preview ซึ่ง​เป็น​สิ่ง​ที่ JVM ใช้​ปฏิเสธ​มัน มี​สอง​ส่วน · ส่วน​หลัก​บอก​รุ่น ส่วน​รอง​บอก​ว่า​เป็น​ของ preview

69 คือ​ส่วน​หลัก ซึ่ง​ตรง​กับ JDK 25 · 65535 คือ​ส่วน​รอง ซึ่ง​เป็น​ค่า​สูงสุด​ที่​ช่อง​นั้น​เก็บ​ได้

class file ธรรมดา​มี​ส่วน​รอง​เป็น 0 · ส่วน class ที่​แปล​ด้วย​ธง preview ถูก​ประทับ 65535 ไว้ ถาวร​ใน​ตัว file

ผล​ที่​ตาม​มา​มี​สาม​ข้อ และ​ทั้ง​สาม​ข้อ​คือ​ราคา

  • class นั้น​รัน​ได้​เฉพาะ​บน JDK รุ่น​ที่​แปล​มัน​เท่านั้น ไม่ใช่​รุ่น​นั้น​ขึ้น​ไป
  • ต้อง​ใส่​ธง​ทุก​ที่​ที่​รัน ทั้ง​เครื่อง​พัฒนา ทั้ง CI ทั้ง​ปลาย​ทาง
  • ของ​ที่​รวม class นั้น​ไว้ ติด​ข้อ​จำกัด​เดียวกัน​ทั้ง​ก้อน
flowchart TB
  S["F.java"] -->|"javac --enable-preview"| C["F.class<br/>version 69.65535"]
  C -->|"java (ไม่ใส่ธง)"| X["ถูกปฏิเสธตั้งแต่อ่านหัว file"]
  C -->|"java --enable-preview"| OK["รันได้"]
  C -->|"JDK รุ่นอื่น"| X2["ถูกปฏิเสธ แม้ใส่ธง"]

คำ​บรรยาย​ภาพ: ธง​ตอน​แปล​ประทับ​เครื่องหมาย​ลง class file แล้ว​เครื่องหมาย​นั้น​ตัดสิน​ทุก​อย่าง​หลัง​จาก​นั้น

ราคา​ข้อ​ที่​สอง​ที่​ไม่มี​ใคร​บอก · API เปลี่ยน​รูป​จริง

หัวข้อ​ที่​มีชื่อ​ว่า “ราคา​ข้อ​ที่​สอง​ที่​ไม่มี​ใคร​บอก · API เปลี่ยน​รูป​จริง”

บท​ที่ 1 แสดง​ไว้​แล้ว แต่​ตรง​นี้​คือ​ที่​ที่​มัน​มี​ความ​หมาย

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { ... }

รูป​นี้​เคย​ถูก​ต้อง​ใน​รุ่น​ก่อน​หน้า · วัน​นี้​ได้ cannot find symbol

นี่​คือ​สิ่ง​ที่​คำ​ว่า preview หมาย​ถึง​จริงๆ · ไม่ใช่ “ยัง​ไม่​ค่อย​เสถียร” แต่​คือ “รูป​ของ​มัน​จะ​เปลี่ยน และ​ของ​เก่า​จะ​ไม่มี​ทาง​เข้า​กัน​ได้”

ถ้า​คุณ​เขียน code ด้วย​รูป​เก่า​ไว้​หนึ่ง​พัน​บรรทัด การ​ขึ้น​รุ่น​ถัด​ไป​คือ​การ​แก้​ทั้ง​พัน​บรรทัด​นั้น · ไม่ใช่​การ​แก้​ธง​หนึ่ง​ตัว

เกณฑ์​สาม​ข้อ ที่​ตอบ​ได้​ด้วย​ข้อ​เท็จ​จริง ไม่ใช่​ด้วย​รสนิยม

หนึ่ง · ของ​ที่​คุณ​กำลัง​สร้าง มีอายุ​ยาว​กว่า​รอบ​การ​ปล่อย​ของ JDK ไหม ถ้า​เป็น​เครื่อง​มือ​ภายใน​ที่​ตาย​ใน​หก​เดือน ราคา​นี้​แทบ​ไม่มี​ความ​หมาย · ถ้า​เป็น library ที่​คน​อื่น​พึ่ง มัน​เป็น​ราคา​ที่​คุณ​ส่ง​ต่อ​ให้​เขา​ด้วย

สอง · คุณ​คุม​ทุก​ที่​ที่​มัน​รัน​หรือ​เปล่า ถ้า​คุม​ได้​หมด การ​ใส่​ธง​เป็น​เรื่อง​ของ​การ​ตั้ง​ค่า​ครั้ง​เดียว · ถ้า​มี​ปลาย​ทาง​ที่​คุณ​ไม่​คุม ข้อ​นี้​ตอบ​ว่า​ไม่​ได้​ทันที

สาม · มี​ทาง​อื่น​ที่ final แล้ว​ไหม StructuredTaskScope ทำ​สิ่ง​ที่ ExecutorService ทำได้​เกือบ​ทั้งหมด แค่​เขียน​ยาว​กว่า · ความ​ยาว​ที่​เพิ่ม​ขึ้น​คือ​ราคา​ที่​จ่าย​ครั้ง​เดียว ส่วน preview คือ​ราคา​ที่​จ่าย​ทุก​รุ่น

ราคา​ข้าง​บน​ใช้​กับ preview เท่านั้น · ไม่​ได้​ใช้​กับ​ของ​ใหม่​ทุก​อย่าง

ScopedValueScopedValueค่าที่​ส่ง​ต่อ​ลง​ไป​ใน​ขอบเขต​ที่​กำหนด โดย​ไม่​ต้อง​ส่ง​ผ่าน argument ทุก​ชั้น · เข้า​รุ่น​ถาวร​แล้ว​ใน JDK 25 ต่าง​จาก​ที่​หลาย​คน​ยัง​จำ​ว่า​เป็น preview เป็น final แล้ว​ใน 25 · แต่​มัน​เป็น preview มา​หลาย​รุ่น​ติด​กัน คน​จึง​จำ​ภาพ​เก่า​ไว้

เหมือน​กับ Gatherers ที่​บท​ที่ 5 ใช้ · ทั้ง​คู่​รัน​ได้​โดย​ไม่​ต้อง​ใส่​ธง​อะไร​เลย

การ​เลี่ยง​ของ​ที่ final แล้ว ไม่​ได้​ฟรี · คุณ​เขียน​ทาง​อ้อม​ที่​ยาว​กว่า​โดย​ไม่​ได้​อะไร​ตอบแทน · และ​วิธี​ตรวจ​ก็​คือ​คำ​สั่ง​เดียว​กับ​บท​ที่ 1 ซึ่ง​ใช้​เวลา​น้อย​กว่า​การ​ค้นหา

สอง​อย่าง​ที่​ยัง​ไม่มี

  • ไม่​ได้​บอก​ว่า​ควร​รับ​หรือ​ไม่​รับ เพราะ​คำ​ตอบ​ขึ้น​กับ​สาม​เกณฑ์​ข้าง​บน ซึ่ง​เป็น​ข้อ​เท็จ​จริง​ของ​โปร​เจ​กต์​คุณ ไม่ใช่​ของ​ภาษา
  • ไม่​ได้​แตะ incubator module ซึ่ง​เป็น​สถานะ​ที่​ต่าง​จาก preview อีก​ชั้น และ​มี​ธง​คนละ​ตัว

บท​นี้​เปลี่ยน​คำถาม​จาก “มัน​พร้อม​หรือ​ยัง” เป็น “ราคา​ของ​มัน​คือ​อะไร”

ราคา​ของ preview วัด​ได้​สอง​อย่าง · เครื่องหมาย 65535 ที่​ประทับ​ลง class file แล้ว​ตัดสิน​ทุก​อย่าง​หลัง​จาก​นั้น และ รูป​ของ API ที่​เปลี่ยน​จริง

ทั้ง​สอง​ข้อ​ไม่​ได้​แปล​ว่า​ห้าม​ใช้ · มัน​แปล​ว่า​ให้​ตัดสิน​ใจ​โดย​รู้​ว่า​จ่าย​อะไร

บท​หน้า​เป็น​บท​สุดท้าย — เรา​รวม​ทุก​อย่าง​ที่​วัด​มา​เป็น​ลำดับ​ว่า ควร​รับ​อะไร​เข้า​ทีม​ก่อน


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

ข้อความ​ที่ JVM ตอบ ยก​มา​ทั้ง​บรรทัด​จาก​การ​รัน​จริง:

  • วัด​เมื่อ 2026-09-01 · javac 25.0.4.1 · openjdk 25.0.4.1 2026-08-18
  • รัน​ซ้ำ​เอง​ได้​ด้วย npm run verify:java-modern ซึ่ง​แปล​ด้วย​ธง​แล้ว​รัน​สอง​รอบ · ช่อง​ควบคุม​คือ​รอบ​ที่​ใส่​ธง ต้อง​รัน​ผ่าน ถ้า​มัน​ไม่​ผ่าน แปล​ว่า​ตัว​วัด​พัง ไม่ใช่​ข้อ​อ้าง​ผิด
  • JEP 12 — Preview Features (เข้า​ถึง 2026-09-01) — กติกา​ของ​สถานะ preview และ​เหตุ​ที่ class file ถูก​ตรึง​กับ​รุ่น
  • The Java Virtual Machine Specification (เข้า​ถึง 2026-09-01) — ช่อง minor_version และ​ค่า 65535

เช็กความเข้าใจ — บทที่ 7

ข้อ 1 / 3

class file ที่แปลด้วย `--enable-preview` มีเลขรุ่นส่วนรองเป็น `65535` · นั่นทำให้เกิดอะไร