ฉันไปเล่นเกมช้า แต่สิ่งที่คุ้มค่าฉันต้องการเพิ่ม 2 Cents ของฉัน พวกเขาขัดกับเป้าหมายการออกแบบOptional
ซึ่งสรุปได้ดีจากคำตอบของ Stuart Marksแต่ฉันก็ยังเชื่อในความถูกต้องของมัน (ชัด)
ใช้ตัวเลือกทุกที่
โดยทั่วไป
ฉันเขียนโพสต์บล็อกOptional
ทั้งหมดเกี่ยวกับการใช้แต่โดยพื้นฐานแล้วมาที่นี่:
- ออกแบบชั้นเรียนของคุณเพื่อหลีกเลี่ยงทางเลือกหากเป็นไปได้
- ในกรณีที่เหลืออยู่ทั้งหมดควรใช้ค่าเริ่มต้น
Optional
แทนnull
- อาจทำให้ข้อยกเว้นสำหรับ:
- ตัวแปรท้องถิ่น
- ส่งคืนค่าและอาร์กิวเมนต์ไปยังเมธอดส่วนตัว
- บล็อกโค้ดที่มีประสิทธิภาพสูง (ไม่ต้องเดาใช้ profiler)
ข้อยกเว้นสองข้อแรกสามารถลดค่าใช้จ่ายด้านการรับรู้ของการห่อและการอ้างอิงที่Optional
ไม่เกี่ยวข้อง พวกเขาได้รับการคัดเลือกจนไม่สามารถผ่านเขตแดนจากกฎหมายหนึ่งไปสู่อีกตัวอย่าง
โปรดทราบว่าการดำเนินการนี้จะไม่อนุญาตให้ใช้Optional
กับคอลเล็กชันซึ่งเกือบจะไม่ดีเท่าnull
s อย่าทำอย่างนั้น ;)
เกี่ยวกับคำถามของคุณ
- ใช่.
- หากการใช้งานมากเกินไปไม่มีตัวเลือกใช่
- หากวิธีการอื่น (subclassing, decorating, ... ) ไม่มีตัวเลือกใช่
- ได้โปรดอย่า!
ข้อดี
การทำเช่นนี้จะช่วยลดการปรากฏตัวของnull
s ในฐานรหัสของคุณแม้ว่าจะไม่ได้กำจัดพวกเขา แต่นั่นไม่ใช่ประเด็นหลัก มีข้อดีที่สำคัญอื่น ๆ :
ชี้แจงเจตนา
ใช้Optional
อย่างชัดเจนเป็นการแสดงออกว่าตัวแปรเป็นทางเลือก ผู้อ่านรหัสหรือผู้บริโภคของ API ใด ๆ ของคุณจะถูกตีที่หัวด้วยความจริงที่ว่าไม่มีอะไรที่นั่นและจำเป็นต้องมีการตรวจสอบก่อนที่จะเข้าถึงค่า
ลบความไม่แน่นอนออก
หากไม่มีOptional
ความหมายของnull
เหตุการณ์ก็ไม่ชัดเจน มันอาจจะเป็นตัวแทนทางกฎหมายของรัฐ (ดูMap.get
) หรือข้อผิดพลาดในการใช้งานเช่นการเริ่มต้นที่ขาดหายไปหรือล้มเหลว
Optional
การเปลี่ยนแปลงนี้อย่างมากกับการใช้งานถาวรของ ที่นี่แล้วการเกิดขึ้นของnull
บ่งบอกถึงการปรากฏตัวของข้อบกพร่อง (เพราะหากค่าได้รับอนุญาตให้หายไปOptional
จะมีการใช้งาน) สิ่งนี้ทำให้การดีบักข้อยกเว้นตัวชี้โมฆะง่ายขึ้นมากเนื่องจากคำถามของความหมายของnull
คำตอบนี้ได้ถูกตอบแล้ว
ตรวจสอบ Null เพิ่มเติม
ตอนนี้ไม่มีอะไรที่จะสามารถทำได้null
อีกต่อไป ไม่ว่าจะมีคำอธิบายประกอบการยืนยันหรือการตรวจสอบธรรมดาคุณไม่ต้องคิดว่าอาร์กิวเมนต์นี้หรือประเภทการส่งคืนนั้นอาจเป็นโมฆะ มันเป็นไปไม่ได้!
ข้อเสีย
แน่นอนว่าไม่มีกระสุนเงิน ...
ประสิทธิภาพ
การห่อค่า (โดยเฉพาะอย่างยิ่งการใช้พื้นฐาน) ลงในอินสแตนซ์พิเศษสามารถทำให้ประสิทธิภาพลดลง ในลูปแน่นนี้อาจกลายเป็นที่สังเกตได้หรือแย่ลง
โปรดทราบว่าคอมไพเลอร์อาจหลีกเลี่ยงการอ้างอิงพิเศษสำหรับอายุการใช้งานสั้น ๆ ของOptional
s ในประเภทค่า Java 10 อาจลดหรือลบบทลงโทษเพิ่มเติม
การทำให้เป็นอันดับ
Optional
ไม่ต่อเนื่องแต่การแก้ปัญหาไม่ซับซ้อนเกินไป
ไม่แปรเปลี่ยน
เนื่องจากความไม่แน่นอนของประเภททั่วไปใน Java การดำเนินการบางอย่างกลายเป็นเรื่องยุ่งยากเมื่อชนิดของค่าที่แท้จริงถูกผลักเข้าไปในอาร์กิวเมนต์ประเภททั่วไป ตัวอย่างที่จะได้รับที่นี่ (ดู "polymorphism Parametric")
Map<Character, String>
เช่นOptional.ofNullable(map.get(c)).orElse(String.valueOf(c))
หากไม่มีการเปลี่ยนตัวฉันสามารถใช้นี้ นอกจากนี้ทราบว่าเป็นตัวเลือกที่ถูกขโมยมาจากฝรั่งและมันมีไวยากรณ์มาก nicer:Optional.fromNullable(map.get(c)).or(String.valueOf(c));