วิธีเริ่มต้นคืออะไร?
หลังจากที่ Java 8 ได้รับการปล่อยตัววิธีใหม่สามารถเพิ่มลงในอินเทอร์เฟซได้ แต่อินเทอร์เฟซยังคงสามารถใช้งานร่วมกับคลาสการใช้งานได้ สิ่งนี้สำคัญมากเพราะไลบรารีคลาสที่คุณพัฒนาอาจถูกใช้อย่างกว้างขวางโดยนักพัฒนาหลายคน ก่อนที่ Java 8 หลังจากอินเทอร์เฟซถูกปล่อยออกมาในไลบรารีคลาสหากมีการเพิ่มวิธีการใหม่ลงในอินเทอร์เฟซแอปพลิเคชันเหล่านั้นที่ใช้อินเตอร์เฟสนี้จะเสี่ยงต่อการล่มโดยใช้อินเทอร์เฟซเวอร์ชันใหม่
ด้วย Java 8 ไม่มีอันตรายเช่นนี้ใช่ไหม คำตอบคือไม่
การเพิ่มวิธีการเริ่มต้นไปยังอินเทอร์เฟซอาจทำให้คลาสการใช้งานบางอย่างไม่พร้อมใช้งาน
ก่อนอื่นมาดูรายละเอียดของวิธีการเริ่มต้น
ใน Java 8 สามารถใช้วิธีการในอินเทอร์เฟซ (วิธีการคงที่ใน Java 8 สามารถนำไปใช้ในอินเทอร์เฟซได้ แต่นี่เป็นอีกหัวข้อหนึ่ง) วิธีการที่ใช้ในอินเทอร์เฟซเรียกว่าวิธีเริ่มต้นซึ่งถูกระบุโดยค่าเริ่มต้นคำหลักเป็นตัวดัดแปลง เมื่อคลาสใช้อินเทอร์เฟซสามารถใช้วิธีการที่ใช้ในอินเทอร์เฟซ แต่ไม่จำเป็น คลาสนี้จะสืบทอดวิธีเริ่มต้น นี่คือเหตุผลที่เมื่ออินเทอร์เฟซเปลี่ยนแปลงคลาสการใช้งานไม่จำเป็นต้องเปลี่ยนแปลง
แล้วเวลาที่จะสืบทอดมากขึ้นล่ะ?
สิ่งต่าง ๆ มีความซับซ้อนเมื่อคลาสใช้อินเทอร์เฟซมากกว่าหนึ่ง (ตัวอย่างเช่นสอง) และอินเทอร์เฟซเหล่านี้มีวิธีการเริ่มต้นที่เหมือนกัน ชั้นเรียนเริ่มต้นวิธีใดที่สืบทอดมา ไม่มีของพวกเขา! ในกรณีนี้คลาสจะต้องใช้วิธีเริ่มต้น (เท่านั้น) ด้วยตัวเอง (โดยตรงหรือสืบทอดคลาสระดับสูงกว่าบนต้นไม้)
เช่นเดียวกันเมื่ออินเทอร์เฟซหนึ่งใช้วิธีการเริ่มต้นและอินเตอร์เฟสอื่น ๆ ประกาศวิธีเริ่มต้นเป็นนามธรรม Java 8 พยายามหลีกเลี่ยงสิ่งที่ไม่ชัดเจนและทำให้มันเข้มงวด หากมีการประกาศวิธีการในหลายอินเทอร์เฟซการใช้งานเริ่มต้นใด ๆ จะไม่ได้รับการสืบทอดและคุณจะได้รับข้อผิดพลาดในการรวบรวมเวลา
อย่างไรก็ตามหากคุณรวบรวมชั้นเรียนของคุณจะไม่มีข้อผิดพลาดในการรวบรวมเวลา ณ จุดนี้ Java 8 ไม่สอดคล้องกัน มันมีเหตุผลของตัวเองด้วยเหตุผลหลายประการ ฉันไม่ต้องการอธิบายรายละเอียดหรือพูดคุยในเชิงลึกที่นี่ (เพราะ: เวอร์ชันได้รับการปล่อยตัวและการสนทนานั้นยาวเกินไปและแพลตฟอร์มนี้ไม่เคยพูดถึงเรื่องนี้)
ชั้นเรียนสามารถทำงานได้ตามปกติในกรณีข้างต้น อย่างไรก็ตามไม่สามารถคอมไพล์ใหม่ด้วยอินเทอร์เฟซที่แก้ไขได้ แต่ยังสามารถทำงานได้ด้วยอินเทอร์เฟซเก่า ต่อไป
เมื่ออินเทอร์เฟซทั้งสองให้การใช้งานเริ่มต้นกับวิธีเดียวกันวิธีนี้ไม่สามารถเรียกได้เว้นแต่ว่าคลาสการใช้งานจะใช้วิธีการเริ่มต้น (ไม่ว่าจะใช้โดยตรงหรือสืบทอดคลาสระดับสูงกว่าบนแผนผังสำหรับการใช้งาน)
อย่างไรก็ตามคลาสนี้เข้ากันได้ สามารถโหลดได้ด้วยอินเทอร์เฟซใหม่หรือแม้กระทั่งการดำเนินการตราบใดที่ไม่เรียกวิธีการที่มีการใช้งานเริ่มต้นในทั้งสองอินเตอร์เฟส
รหัสตัวอย่าง
เพื่อแสดงให้เห็นถึงตัวอย่างข้างต้นฉันได้สร้างไดเรกทอรีทดสอบสำหรับ C.Java ซึ่งมีไดเรกทอรีย่อย 3 รายการด้านล่างซึ่งใช้ในการจัดเก็บ i1.java และ i2.java ไดเรกทอรีทดสอบมีซอร์สโค้ดของ C.Java ของคลาส C ไดเรกทอรีพื้นฐานมีส่วนต่อประสานกับเวอร์ชันที่สามารถรวบรวมและเรียกใช้ได้ I1 มีวิธี M () ที่ใช้งานโดยค่าเริ่มต้นและ I2 ไม่มีวิธีการใด ๆ
คลาสการใช้งานมีวิธีการหลักเพื่อให้เราสามารถดำเนินการในการทดสอบ มันจะตรวจสอบว่ามีพารามิเตอร์บรรทัดคำสั่งหรือไม่เพื่อให้เราสามารถดำเนินการทดสอบที่เรียกได้ว่า m () และไม่โทร m ()
คลาสสาธารณะ C ดำเนินการ i1, i2 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {c c = ใหม่ c (); if (args.length == 0) {cm (); }}} อินเตอร์เฟสสาธารณะ i1 {void moid m () {system.out.println ("สวัสดีอินเตอร์เฟส 1"); }} อินเตอร์เฟสสาธารณะ i2 {}ใช้บรรทัดคำสั่งต่อไปนี้เพื่อรวบรวมและเรียกใช้:
javac -cp .: base c.javajava -cp.: base chello interface 1
ไดเรกทอรีที่เข้ากันได้มีอินเทอร์เฟซ I2 ด้วยวิธีนามธรรม M () และอินเตอร์เฟส I1 ที่ไม่ได้แก้ไข
อินเทอร์เฟซสาธารณะ i2 {void m ();}สิ่งนี้ไม่สามารถใช้ในการรวบรวมคลาส C:
javac -cp .: เข้ากันได้ C.Javac.java:1: ข้อผิดพลาด: C ไม่ใช่นามธรรมและไม่ได้แทนที่วิธีนามธรรม m () ใน I2Public Class C ใช้ i1, i2 { ^ 1 ข้อผิดพลาดข้อความแสดงข้อผิดพลาดมีความแม่นยำมาก เนื่องจากเรามี c.class ที่ได้จากการรวบรวมก่อนหน้านี้หากเรารวบรวมอินเทอร์เฟซในไดเรกทอรีที่เข้ากันได้เราจะยังคงได้รับสองอินเทอร์เฟซที่สามารถเรียกใช้คลาสการใช้งาน:
Javac เข้ากันได้/i*.javajava -cp .: อินเตอร์เฟส Chello ที่เข้ากันได้ 1
ไดเรกทอรีที่สามที่เรียกว่าผิดและอินเทอร์เฟซ I2 ที่มีอยู่ยังกำหนดวิธี M ():
อินเทอร์เฟซสาธารณะ i2 {เป็นโมฆะเริ่มต้น m () {system.out.println ("สวัสดีอินเตอร์เฟส 2"); -เราไม่ควรเบื่อหน่ายในการรวบรวม แม้ว่าวิธี M () จะถูกกำหนดสองครั้งคลาสการใช้งานยังสามารถทำงานได้ตราบใดที่ไม่เรียกวิธีการที่กำหนดไว้หลายครั้ง แต่ตราบใดที่เราเรียกวิธี M () มันจะล้มเหลวทันที นี่คือพารามิเตอร์บรรทัดคำสั่งที่เราใช้:
javac ผิด/*. javajava -cp.: ข้อยกเว้น C ผิดในเธรด "หลัก" java.lang.incompatibleclasschangeRoror: วิธีการเริ่มต้นที่ขัดแย้งกัน: i1.m i2.m ที่ CM (C.Java) ที่ C.Main (C.Java:5) Java -CP
สรุปแล้ว
เมื่อคุณพอร์ตไลบรารีคลาสที่เพิ่มการใช้งานเริ่มต้นไปยังส่วนต่อประสานกับสภาพแวดล้อม Java 8 โดยทั่วไปจะไม่มีปัญหา อย่างน้อยนี่คือสิ่งที่นักพัฒนาห้องสมุด Java8 คลาสคิดเมื่อเพิ่มวิธีการเริ่มต้นในคลาสคอลเลกชัน แอปพลิเคชันที่ใช้ไลบรารีคลาสของคุณยังคงพึ่งพาไลบรารีคลาสของ Java7 โดยไม่ต้องใช้วิธีเริ่มต้น เมื่อใช้และแก้ไขไลบรารีคลาสที่แตกต่างกันหลายแห่งมีโอกาสขัดแย้งเล็กน้อย ฉันจะหลีกเลี่ยงได้อย่างไร?
ออกแบบห้องสมุดชั้นเรียนของคุณเหมือนก่อน อย่าใช้มันเบา ๆ เมื่อคุณพึ่งพาวิธีเริ่มต้น อย่าใช้มันอย่างจำเป็น เลือกชื่อวิธีอย่างชาญฉลาดเพื่อหลีกเลี่ยงความขัดแย้งกับอินเทอร์เฟซอื่น ๆ เราจะเรียนรู้วิธีการใช้คุณสมบัตินี้เพื่อการพัฒนาในการเขียนโปรแกรม Java
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com