1. วิธีการเริ่มต้นคืออะไร และเหตุใดจึงควรมีวิธีการเริ่มต้น?
พูดง่ายๆ ก็คือ อินเทอร์เฟซสามารถมีวิธีการใช้งานได้ และไม่จำเป็นต้องมีคลาสการใช้งานเพื่อนำวิธีการของมันไปใช้ เพียงเพิ่มคำหลักเริ่มต้นไว้หน้าชื่อวิธีการ
ทำไมเราถึงต้องการคุณสมบัตินี้? ประการแรก อินเทอร์เฟซก่อนหน้านี้เป็นดาบสองคม ข้อดีคือมุ่งเน้นไปที่นามธรรมมากกว่าการเขียนโปรแกรมเฉพาะ ข้อเสียคือเมื่อจำเป็นต้องแก้ไขอินเทอร์เฟซ คลาสทั้งหมดที่ใช้อินเทอร์เฟซจำเป็นต้องได้รับการแก้ไข กรอบงานการรวบรวมปัจจุบันก่อน Java 8 ไม่มีวิธีการ foreach โดยทั่วไปวิธีแก้ไขที่เป็นไปได้คือการเพิ่มวิธีการใหม่และการใช้งานให้กับอินเทอร์เฟซที่เกี่ยวข้องใน JDK อย่างไรก็ตาม สำหรับเวอร์ชันที่เผยแพร่ ไม่มีวิธีใดที่จะเพิ่มวิธีการใหม่ให้กับอินเทอร์เฟซโดยไม่กระทบต่อการใช้งานที่มีอยู่ ดังนั้นจึงมีการนำวิธีการเริ่มต้นมาใช้ จุดประสงค์คือเพื่อแก้ปัญหาความไม่เข้ากันระหว่างการปรับเปลี่ยนอินเทอร์เฟซและการใช้งานที่มีอยู่
ตัวอย่างง่ายๆ: อินเทอร์เฟซ A คลาส Clazz ใช้อินเทอร์เฟซ A
คัดลอกรหัสรหัสดังต่อไปนี้:
อินเทอร์เฟซสาธารณะ A {
ค่าเริ่มต้นเป็นโมฆะ foo(){
System.out.println("การโทร A.foo()");
-
-
Clazz คลาสสาธารณะใช้ A {
โมฆะคงที่สาธารณะ main (String [] args) {
Clazz clazz = ใหม่ Clazz();
clazz.foo();//โทร A.foo()
-
-
โค้ดจะคอมไพล์แม้ว่าคลาส Clazz จะไม่ใช้เมธอด foo() ก็ตาม การใช้งานเริ่มต้นของเมธอด foo() มีให้ในอินเทอร์เฟซ A
2. การเปรียบเทียบระหว่างคลาสนามธรรมและอินเทอร์เฟซใน Java 8
หลังจากฟีเจอร์การทำงานนี้ออกมา นักเรียนหลายคนก็โต้ตอบกัน อินเทอร์เฟซ Java 8 มีวิธีการใช้งานที่แตกต่างกันอย่างไร จริงๆ แล้วยังมีอยู่บ้าง โปรดดูตารางด้านล่างเพื่อเปรียบเทียบ -
| ความคล้ายคลึงกัน | ความแตกต่าง |
1. ล้วนเป็นประเภทนามธรรม 2. ทุกคนสามารถมีวิธีการใช้งานได้ (อินเทอร์เฟซไม่เคยทำงานมาก่อน) 3. คุณสามารถใช้วิธีการทั้งหมดได้โดยไม่ต้องนำคลาสหรือผู้สืบทอดมาใช้ (ซึ่งก่อนหน้านี้ไม่สามารถทำได้ ตอนนี้ผู้ดำเนินการไม่จำเป็นต้องใช้วิธีการเริ่มต้นในอินเทอร์เฟซ) | 1. คลาสนามธรรมไม่สามารถมีการสืบทอดหลายรายการได้ อินเทอร์เฟซสามารถ (ไม่ว่าจะเป็นการสืบทอดหลายประเภทหรือการสืบทอดพฤติกรรมหลายรายการ) 2. คลาสนามธรรมและอินเทอร์เฟซสะท้อนถึงแนวคิดการออกแบบที่แตกต่างกัน ในความเป็นจริง คลาสนามธรรมแสดงถึงความสัมพันธ์ "is-a" และอินเทอร์เฟซแสดงถึงความสัมพันธ์ "like-a" 3. ตัวแปรที่กำหนดในอินเทอร์เฟซเริ่มต้นเป็นประเภทสุดท้ายแบบคงที่สาธารณะ และต้องระบุค่าเริ่มต้น ดังนั้นจึงไม่สามารถกำหนดใหม่ในคลาสการใช้งาน และไม่สามารถเปลี่ยนแปลงค่าตัวแปรในค่าเริ่มต้นของคลาสนามธรรมได้ เป็นประเภทที่เป็นมิตรและสามารถระบุค่าได้ในคลาสย่อย สามารถกำหนดใหม่ในคลาสหรือกำหนดใหม่ได้ |
3. คำอธิบายข้อขัดแย้งของการสืบทอดหลายรายการ
เนื่องจากวิธีการเดียวกันนี้สามารถนำไปใช้ได้จากอินเทอร์เฟซที่แตกต่างกัน ข้อขัดแย้งจึงจะเกิดขึ้นตามธรรมชาติ กฎสำหรับการพิจารณาข้อขัดแย้งโดยวิธีการเริ่มต้นมีดังนี้:
1. วิธีการประกาศในคลาสจะมีความสำคัญเหนือกว่าวิธีการเริ่มต้นใด ๆ (คลาสจะชนะเสมอ)
2. มิฉะนั้น การใช้งานที่เฉพาะเจาะจงที่สุดจะถูกเลือกก่อน ตัวอย่างเช่น ในตัวอย่างด้านล่าง B จะเขียนเมธอด hello ของ A ใหม่
ผลลัพธ์คือ: Hello World จาก B
หากคุณต้องการเรียกใช้ฟังก์ชันเริ่มต้นของ A ให้ใช้ไวยากรณ์ใหม่ X.super.m(...) จากนั้น แก้ไขคลาส C ใช้อินเทอร์เฟซ A และเขียนเมธอด hello ใหม่ ดังที่แสดงด้านล่าง:
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสสาธารณะ C ใช้ A{
@แทนที่
โมฆะสาธารณะสวัสดี () {
A.super.hello();
-
โมฆะคงที่สาธารณะ main (String [] args) {
ใหม่ C().hello();
-
-
ผลลัพธ์คือ: Hello World จาก A
4. สรุป
วิธีการเริ่มต้นทำให้เราสะดวกในการแก้ไขอินเทอร์เฟซโดยไม่ทำลายโครงสร้างของคลาสการใช้งานดั้งเดิม ในปัจจุบัน กรอบงานการรวบรวมของ Java 8 ได้ใช้วิธีการเริ่มต้นอย่างกว้างขวางเพื่อปรับปรุงมัน เมื่อเราเริ่มใช้นิพจน์แลมบ์ดาในที่สุด ของ Java 8 มีให้สำหรับเรามีประสบการณ์การเปลี่ยนแปลงที่ราบรื่น บางทีเราจะได้เห็นการประยุกต์ใช้วิธีการเริ่มต้นในการออกแบบ API มากขึ้นในอนาคต