preview ไม่ได้ตรึงแค่ธง มันตรึง class file ไว้กับรุ่น
คำว่า preview ใน Java ถูกอ่านว่า “ยังไม่ค่อยเสถียร” กันเป็นส่วนใหญ่
ของจริงเป็นข้อที่แข็งกว่านั้นมาก และวัดได้ด้วยคำสั่งสองบรรทัด
แปลด้วยธง แล้วรันโดยไม่ใส่ธง
หัวข้อที่มีชื่อว่า “แปลด้วยธง แล้วรันโดยไม่ใส่ธง”javac --release 25 --enable-preview -d out F.javajava -cp out FPreview features are not enabled for F (class file version 69.65535). Try running with '--enable-preview'JVM ไม่ได้อ่าน code ของคุณแล้วตัดสินใจ · มันอ่านหัวของ class file แล้วปฏิเสธตั้งแต่ตรงนั้น
65535 คือเครื่องหมาย ไม่ใช่ตัวเลขบังเอิญ
หัวข้อที่มีชื่อว่า “65535 คือเครื่องหมาย ไม่ใช่ตัวเลขบังเอิญ”เลขรุ่นของ class file มีสองส่วน · ส่วนหลักบอกรุ่นของภาษา ส่วนรองปกติเป็น 0
69 ตรงกับ JDK 25 · 65535 คือค่าสูงสุดที่ช่องสองไบต์นั้นเก็บได้
· มันถูกเลือกเพราะไม่มีทางชนกับเลขรุ่นจริงในอนาคต
class ที่แปลด้วยธง preview ถูกประทับเลขนั้นไว้ ถาวรในตัว file · ลบไม่ได้ แก้ไม่ได้ นอกจากแปลใหม่
ผลสามข้อ และทั้งสามคือราคา
หัวข้อที่มีชื่อว่า “ผลสามข้อ และทั้งสามคือราคา”- class นั้นรันได้เฉพาะบน JDK รุ่นที่แปลมันเท่านั้น · ไม่ใช่รุ่นนั้นขึ้นไป ซึ่งต่างจาก class ธรรมดาที่รุ่นใหม่กว่ารันของเก่าได้
- ต้องใส่ธงทุกที่ที่รัน ทั้งเครื่องพัฒนา ทั้ง CI ทั้งปลายทาง
- ของที่รวม class นั้นไว้ ติดข้อจำกัดเดียวกันทั้งก้อน · jar หนึ่งใบที่มี class preview อยู่หนึ่งตัว กลายเป็น jar ที่ผูกกับรุ่น
ราคาข้อที่สอง · API เปลี่ยนรูปจริง
หัวข้อที่มีชื่อว่า “ราคาข้อที่สอง · API เปลี่ยนรูปจริง”คำว่า preview ไม่ได้แปลว่า “อาจมี bug” · มันแปลว่า รูปของมันจะเปลี่ยน
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { ... }รูปนี้อยู่ในบทความเรื่อง structured concurrency แทบทุกชิ้นที่เขียนระหว่างปี 2023 ถึง 2025
แปลบน JDK 25 แล้วได้
error: cannot find symbolไม่ใช่คำเตือน ไม่ใช่ deprecation · ชื่อนั้นไม่มีอยู่แล้ว
รูปที่ใช้ได้ในรุ่นนี้คือ
try (var scope = StructuredTaskScope.open()) { var s = scope.fork(() -> 1); scope.join(); System.out.println(s.get());}ไม่ใช่การแก้ธงหนึ่งตัว · และไม่มีเครื่องมือไหนแปลงให้อัตโนมัติ เพราะรูปที่เปลี่ยน ไม่ใช่แค่ชื่อ แต่เป็นวิธีที่ scope รายงานความล้มเหลว
นี่คือความต่างระหว่าง “ยังไม่เสถียร” กับ “ยังไม่ตกลงว่าจะมีรูปอย่างไร”
เกณฑ์สามข้อ ที่ตอบด้วยข้อเท็จจริง
หัวข้อที่มีชื่อว่า “เกณฑ์สามข้อ ที่ตอบด้วยข้อเท็จจริง”หนึ่ง · ของที่คุณสร้าง มีอายุยาวกว่ารอบการปล่อยของ JDK ไหม
เครื่องมือภายในที่ตายในหกเดือน ราคานี้แทบไม่มีความหมาย · library ที่คนอื่นพึ่ง เป็นราคาที่คุณส่งต่อให้เขาด้วย
สอง · คุณคุมทุกที่ที่มันรันหรือเปล่า
ถ้ามีปลายทางที่คุณสั่งให้ใส่ธงไม่ได้ ข้อนี้ตอบว่าไม่ได้ทันที · ไม่ต้องคิดต่อ
สาม · มีทางอื่นที่ final แล้วไหม
ความยาวที่เพิ่มขึ้นจากการใช้ของเดิม คือราคาที่จ่ายครั้งเดียว · ส่วน preview คือราคาที่จ่ายทุกรุ่น
อีกทางที่คนพลาด · เลี่ยงของที่ final ไปแล้ว
หัวข้อที่มีชื่อว่า “อีกทางที่คนพลาด · เลี่ยงของที่ final ไปแล้ว”ราคาข้างบนใช้กับ preview เท่านั้น ไม่ได้ใช้กับของใหม่ทุกอย่าง
วัดบน JDK 25 ด้วยการแปลตัวอย่างสองรอบ ต่างกันที่ธงเดียว · ได้ แปด final สอง preview
| final | preview |
|---|---|
record · sealed + switch · record pattern · text block · Gatherers · virtual thread · ScopedValue · import module | StructuredTaskScope · ชนิดพื้นฐานใน pattern |
Gatherers กับ ScopedValue เป็น preview มาหลายรุ่นติดกัน คนจึงจำภาพเก่าไว้
· วันนี้ทั้งคู่รันได้โดยไม่ต้องใส่ธงอะไรเลย
การเลี่ยงของที่ final แล้ว ไม่ได้ฟรี · คุณเขียนทางอ้อมที่ยาวกว่าโดยไม่ได้อะไรตอบแทน
วิธีตรวจที่ไม่ล้าสมัย
หัวข้อที่มีชื่อว่า “วิธีตรวจที่ไม่ล้าสมัย”javac --release 25 F.java # ผ่าน = finaljavac --release 25 --enable-preview F.java # ผ่านเฉพาะรอบนี้ = previewคำสั่งสองบรรทัดนี้ถาม compiler ที่อยู่บนเครื่องคุณ ไม่ได้ถามคนที่เขียนเมื่อสามปีก่อน · ใช้กับรุ่นถัดไปที่ยังไม่ออกได้ด้วย
ทุกข้อความและทุกสถานะมาจากการแปลและรันจริง:
- วัดเมื่อ 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)
- The Java Virtual Machine Specification
(เข้าถึง 2026-09-01) — ช่อง
minor_versionและค่า65535 - เรื่องนี้เป็นบทที่ 7 ของ คอร์ส Java 8 ถึง 25 ซึ่งวัดของอื่นอีกหกอย่างด้วยหน่วยเดียวกัน