สรุปประเด็นสำคัญ
- แม้ข้อยกเว้นแบบ checked ของ Java จะเป็นฟีเจอร์ที่ถูกวิจารณ์อย่างกว้างขวางในชุมชน แต่ก็มีข้อดีโดดเด่นมากในด้าน type safety
- มอบกลไกด้าน type safety ที่มีแนวคิดคล้ายกับ
Result<T, E> ของ Rust หรือ Either a b ของ Haskell
- ข้อยกเว้นแบบ checked แสดงความเป็นไปได้ของความล้มเหลวที่อาจเกิดขึ้นอย่างชัดเจนใน method signature และบังคับให้จัดการข้อผิดพลาดผ่าน type system
ข้อดีของข้อยกเว้นแบบ checked
- มอบ type safety โดยตรวจสอบว่ามีการจัดการข้อยกเว้นหรือไม่ตั้งแต่คอมไพล์ไทม์
- ระบุความเป็นไปได้ของข้อยกเว้นใน method signature ด้วย clause
throws ทำให้เป็นส่วนหนึ่งของสัญญา API
- มีกลไกที่สะดวกซึ่งเพียงแค่ประกาศไว้ก็สามารถส่งต่อข้อยกเว้นได้โดยอัตโนมัติ
- ต่างจาก Rust ที่ไม่ต้องมีไวยากรณ์เพิ่มเติมอย่างตัวดำเนินการ
? ในทุกครั้งที่เรียกใช้
ปัญหาของข้อยกเว้นแบบ checked
- ทำให้เกิดโค้ด boilerplate มากเกินไปใน call chain
- เข้ากันได้ไม่ดีกับการเขียนโปรแกรมเชิงฟังก์ชัน เช่น lambda และ Stream API ที่ถูกนำมาใช้ตั้งแต่ Java 8
- การเพิ่มข้อยกเว้นใหม่ใน interface อาจทำให้ความเข้ากันได้พัง ส่งผลให้การพัฒนา API ต่อทำได้ยาก
- อาจส่งเสริม anti-pattern ที่เพิกเฉยต่อข้อยกเว้น
ข้อเสนอเพื่อการปรับปรุง
- ปรับปรุง functional interface เพื่อให้ lambda สามารถประกาศข้อยกเว้นแบบ checked ได้
- เพิ่มการรองรับ generic exception type ใน clause
throws
- ขยาย API เพื่อให้จัดการข้อยกเว้นแบบ checked ได้ดีขึ้นในบริบทเชิงฟังก์ชัน
- ผสานการทำงานกับ API ของ
Optional<T> และ Stream<T> ให้ดีขึ้น
เปรียบเทียบกับภาษาอื่น
- Rust: มีกลไกจัดการข้อผิดพลาดแบบชัดเจนผ่าน
Result<T, E> และตัวดำเนินการ ?
- Kotlin: ทำให้ข้อยกเว้นทั้งหมดเป็น unchecked แต่มีโครงสร้างเชิงฟังก์ชันอย่าง
runCatching
- Scala: รองรับการจัดการข้อผิดพลาดเชิงฟังก์ชันผ่าน monadic type อย่าง
Try[T], Either[A, B] เป็นต้น
บทสรุป
- ข้อยกเว้นแบบ checked เป็นฟีเจอร์นวัตกรรมของ Java ที่มักถูกเข้าใจผิดและควรถูกประเมินค่าใหม่
- แทนที่จะละทิ้งไปทั้งหมด การปรับปรุงให้เข้ากับฟีเจอร์สมัยใหม่ของ Java ได้ดีจะเป็นแนวทางที่เหมาะสมกว่า
- ยังมีโอกาสพัฒนาไปในทิศทางที่แก้ปัญหาเชิงปฏิบัติได้ โดยยังคงรักษาแนวคิดเดิมไว้
- การหาจุดสมดุลระหว่าง type safety, ความกระชับของโค้ด และความยืดหยุ่นเป็นสิ่งสำคัญ
1 ความคิดเห็น
รู้สึกเหมือนกำลังวนกลับไปถกเถียงเรื่องเดิมที่พูดกันมานานนับสิบปีอีกครั้ง เหมือนเป็นข้อโต้แย้งว่า Exception ก็มีคุณค่าไม่ต่างจาก Type และผมอยากลองตอบกลับว่ามี Type อย่างเดียวก็เพียงพอแล้ว