หนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของ Java 8 คือdefault
วิธีการใหม่ในส่วนต่อประสาน มีสองเหตุผลหลัก (อาจมีเหตุผลอื่น) ทำไมพวกเขาถึงได้รับการแนะนำ:
- ให้การใช้งานเริ่มต้นจริง ตัวอย่าง:
Iterator.remove()
- อนุญาตให้ใช้กับวิวัฒนาการ JDK API ตัวอย่าง:
Iterable.forEach()
จากมุมมองของนักออกแบบ API ของผมจะชอบที่จะสามารถใช้การปรับเปลี่ยนวิธีการอื่น ๆ final
บนอินเตอร์เฟซเช่น สิ่งนี้จะเป็นประโยชน์เมื่อเพิ่มวิธีอำนวยความสะดวกป้องกันการแทนที่ "โดยไม่ตั้งใจ" ในการใช้คลาส:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
ข้างต้นเป็นวิธีปฏิบัติทั่วไปแล้วถ้าSender
เป็นคลาส:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
ตอนนี้default
และfinal
จะเห็นได้ชัดขัดแย้งกับคำหลัก แต่เริ่มต้นคำหลักที่ตัวเองจะไม่ต้องได้รับอย่างเคร่งครัดดังนั้นฉันสมมติว่าความขัดแย้งนี้เป็นเจตนาที่จะสะท้อนให้เห็นถึงความแตกต่างระหว่าง"วิธีการเรียนกับร่างกาย" (เพียงวิธีการ) และ"อินเตอร์เฟซ วิธีการกับร่างกาย " (วิธีการเริ่มต้น) คือความแตกต่างคือฉันยังไม่เข้าใจ
ในบางช่วงเวลาการสนับสนุนตัวดัดแปลงเช่นstatic
และfinal
วิธีการเชื่อมต่อยังไม่ได้รับการสำรวจอย่างเต็มที่อ้างว่า Brian Goetz :
อีกส่วนคือว่าเราจะไปสนับสนุนเครื่องมือการสร้างคลาสในอินเทอร์เฟซเช่นวิธีสุดท้ายวิธีการส่วนตัววิธีการป้องกันวิธีคงที่และอื่น ๆ อีกมากมายคำตอบคือ: เรายังไม่รู้
ตั้งแต่เวลาดังกล่าวในช่วงปลายปี 2011 เห็นได้ชัดว่ามีการเพิ่มการสนับสนุนstatic
วิธีการในอินเทอร์เฟซ ชัดเจนนี้เพิ่มจำนวนมากของมูลค่าให้กับห้องสมุด JDK Comparator.comparing()
ตัวเองเช่นเดียวกับ
คำถาม:
อะไรคือเหตุผลfinal
(และstatic final
) ที่ไม่เคยทำให้เป็นอินเทอร์เฟซ Java 8?
final
ป้องกันวิธีการที่ถูกแทนที่และเห็นว่าคุณจะต้องแทนที่วิธีการที่สืบทอดมาจากอินเตอร์เฟซที่ฉันไม่เห็นว่าทำไมมันจะทำให้รู้สึกว่ามันจะทำให้สุดท้าย เว้นแต่จะมีความหมายว่าวิธีการเป็นขั้นสุดท้ายหลังจากที่เอาชนะมันครั้งเดียว .. ในกรณีนี้อาจมีปัญหา qas? ถ้าฉันไม่เข้าใจเรื่องนี้โปรดให้ฉัน kmow ดูเหมือนว่าน่าสนใจ
final
จะมีการใช้งานในการป้องกันการใช้คลาสจากการแทนที่การใช้งานเริ่มต้นของวิธีการอินเทอร์เฟซ