ใน Java 8 และใหม่กว่าคำตอบสำหรับคำถามนี้ยังคงใช้ได้ แต่ตอนนี้มีความเหมาะสมมากขึ้น
ประการแรกข้อความเหล่านี้จากคำตอบที่ยอมรับยังคงถูกต้อง:
- อินเทอร์เฟซมีขึ้นเพื่อระบุพฤติกรรมโดยนัยของพวกเขาในสัญญา (คำสั่งของกฎสำหรับพฤติกรรมที่ใช้คลาสต้องปฏิบัติตามเพื่อให้ถือว่าถูกต้อง)
- มีความแตกต่างระหว่างสัญญา (กฎ) และการนำไปใช้งาน (การเข้ารหัสแบบเป็นโปรแกรมของกฎ)
- วิธีการที่ระบุในอินเทอร์เฟซจะต้องถูกนำไปใช้เสมอ (ในบางจุด)
แล้วความแตกต่างที่แปลกใหม่ใน Java 8 คืออะไร? เมื่อพูดถึง"วิธีการเสริม"ใดสิ่งหนึ่งต่อไปนี้เป็นสิ่งที่เหมาะสม:
1. วิธีการที่มีการใช้งานเป็นทางเลือกตามสัญญา
"คำสั่งที่สาม" กล่าวว่าต้องใช้วิธีการอินเทอร์เฟซนามธรรมเสมอและยังคงเป็นจริงใน Java 8+ อย่างไรก็ตามเช่นเดียวกับใน Java Collections Framework คุณสามารถอธิบายวิธีการอินเทอร์เฟซนามธรรมบางอย่างเป็น "ทางเลือก" ในสัญญาได้
ในกรณีนี้ผู้เขียนที่ใช้อินเทอร์เฟซสามารถเลือกที่จะไม่ใช้วิธีนี้ได้ อย่างไรก็ตามคอมไพลเลอร์จะยืนยันในการนำไปใช้งานดังนั้นผู้เขียนจึงใช้โค้ดนี้สำหรับวิธีการทางเลือกที่ไม่จำเป็นในคลาสการนำไปใช้งานเฉพาะ:
public SomeReturnType optionalInterfaceMethodA(...) {
throw new UnsupportedOperationException();
}
ใน Java 7 และรุ่นก่อนหน้านี้เป็น "เมธอดทางเลือก" ชนิดเดียวที่มีกล่าวคือเมธอดที่หากไม่ได้ใช้งานจะโยน UnsupportedOperationException ลักษณะการทำงานนี้จำเป็นต้องระบุโดยสัญญาอินเทอร์เฟซ (เช่นวิธีการเชื่อมต่อที่เป็นทางเลือกของ Java Collections Framework)
2. วิธีการเริ่มต้นที่มีการนำไปใช้ใหม่เป็นทางเลือก
Java 8 นำแนวคิดของวิธีการเริ่มต้น วิธีเหล่านี้เป็นวิธีการที่สามารถนำไปใช้งานได้และมีให้โดยนิยามของอินเตอร์เฟสเอง โดยทั่วไปจะเป็นไปได้ที่จะระบุเมธอดเริ่มต้นก็ต่อเมื่อสามารถเขียนเนื้อความของเมธอดโดยใช้เมธอดอินเทอร์เฟซอื่น ๆ (เช่น "primitives") และเมื่อใดที่this
สามารถหมายถึง
วิธีการเริ่มต้นจะต้องเป็นไปตามสัญญาของอินเทอร์เฟซ (เช่นเดียวกับการใช้งานวิธีการอินเทอร์เฟซอื่น ๆ ต้อง) ดังนั้นการระบุวิธีการใช้งานอินเทอร์เฟซในคลาสการนำไปใช้ขึ้นอยู่กับดุลยพินิจของผู้เขียน (ตราบใดที่พฤติกรรมนั้นเหมาะสมกับจุดประสงค์ของเขาหรือเธอ)
ในสภาพแวดล้อมใหม่นี้ Java Collections Framework สามารถเขียนใหม่เป็น:
public interface List<E> {
:
:
default public boolean add(E element) {
throw new UnsupportedOperationException();
}
:
:
}
ด้วยวิธีนี้เมธอด "ทางเลือก" จะadd()
มีพฤติกรรมเริ่มต้นในการโยน UnsupportedOperationException หากคลาสการใช้งานไม่มีพฤติกรรมใหม่ของตัวเองซึ่งเป็นสิ่งที่คุณต้องการให้เกิดขึ้นและเป็นไปตามสัญญาสำหรับรายการ หากผู้เขียนกำลังเขียนคลาสที่ไม่อนุญาตให้เพิ่มองค์ประกอบใหม่ในการใช้งานรายการการใช้งานadd()
จะเป็นทางเลือกเนื่องจากลักษณะการทำงานเริ่มต้นเป็นสิ่งที่จำเป็น
ในกรณีนี้ "คำสั่งที่สาม" ข้างต้นยังคงเป็นจริงเนื่องจากวิธีนี้ถูกนำไปใช้ในอินเทอร์เฟซ
3. วิธีการที่ส่งกลับOptional
ผลลัพธ์
วิธีการทางเลือกใหม่สุดท้ายเป็นเพียงวิธีการที่ส่งคืนOptional
ไฟล์. Optional
ระดับให้เป็นวิธีเชิงวัตถุเด็ดมากขึ้นในการจัดการกับnull
ผลการ
ในรูปแบบการเขียนโปรแกรมที่คล่องแคล่วเช่นชนิดที่พบเห็นได้ทั่วไปเมื่อเขียนโค้ดด้วย Java Streams API ใหม่ผลลัพธ์ที่เป็นค่าว่าง ณ จุดใดก็ได้ทำให้โปรแกรมหยุดทำงานด้วย NullPointerException Optional
ระดับให้กลไกสำหรับการกลับมาผล null รหัสลูกค้าในวิธีที่ช่วยให้รูปแบบได้อย่างคล่องแคล่วโดยไม่ก่อให้รหัสลูกค้าที่จะผิดพลาด