1. บทนำ
ในภาษาการเขียนโปรแกรมหลายภาษาแนวคิดของการเรียกกลับฟังก์ชั่นมีอยู่ มีพอยน์เตอร์ฟังก์ชั่นใน C และ C ++ ดังนั้นฟังก์ชั่นสามารถส่งผ่านเป็นพารามิเตอร์ไปยังฟังก์ชั่นอื่น ๆ สำหรับการโทรในภายหลัง ใน JavaScript การเรียกกลับฟังก์ชั่นจะถูกนำไปสู่สุดขั้ว การจัดการเหตุการณ์ต่าง ๆ โดยเฉพาะอย่างยิ่งเหตุการณ์แบบอะซิงโครนัสนั้นเสร็จสมบูรณ์โดยการเรียกกลับฟังก์ชั่น
ใน Java สามารถใช้การเรียกกลับฟังก์ชั่นได้ แม้ว่าจะไม่มีตัวชี้ฟังก์ชั่น Java สามารถรับวิธีการเรียนผ่านกลไกการสะท้อนกลับส่งไปยังฟังก์ชั่นอื่น ๆ เป็นพารามิเตอร์ของประเภท java.lang.reflect.method แล้วเรียกฟังก์ชั่นผ่านวิธีการเรียกใช้วัตถุวิธีการ
อย่างไรก็ตามขั้นตอนการโทรด้วยวิธีนี้ค่อนข้างยุ่งยากไม่มีประสิทธิภาพในการดำเนินการและยากที่จะแก้ไขข้อบกพร่อง ใน Java มีกลไกที่สง่างามกว่าการเรียกกลับฟังก์ชั่นนั่นคืออินเทอร์เฟซ
2. ทำไมการเรียกกลับฟังก์ชั่นจึงต้องการ
การเรียกกลับฟังก์ชั่นเป็นวิธีการชะลอการใช้งานฟังก์ชั่นบางอย่าง
หากเรารู้ล่วงหน้าว่าโปรแกรมควรดำเนินการใดบ้างก็ไม่จำเป็นต้องมีการเรียกกลับฟังก์ชั่นเลยและสามารถนำไปใช้ได้โดยตรงระหว่างการเขียนโปรแกรม
แต่หลายครั้งเมื่อเขียนโค้ดโดยเฉพาะอย่างยิ่งเมื่อเขียนคลาสเครื่องมือไลบรารีฟังก์ชั่นหรือเฟรมเวิร์กฟังก์ชั่นทั่วไปและบทคัดย่อจะถูกนำไปใช้ในขณะที่ฟังก์ชั่นในสถานการณ์เฉพาะจะถูกนำไปใช้โดยนักพัฒนาโดยใช้คลาสเหล่านี้
ฟังก์ชั่นการโทรกลับสามารถแก้สถานการณ์นี้ได้ซึ่งคุณไม่ทราบการใช้งานที่เฉพาะเจาะจงล่วงหน้า
ตัวอย่างของฟังก์ชั่นการเรียงลำดับ
ตัวอย่างเช่นเมื่อเราต้องการใช้ฟังก์ชั่นการเรียงลำดับทั่วไปเราไม่ทราบล่วงหน้าว่าองค์ประกอบประเภทใดที่นักพัฒนาอื่น ๆ จะใช้ในการเรียงลำดับและเราไม่ทราบว่ามาตรฐานใดที่จะตัดสินความสัมพันธ์บางส่วน (ขนาด) ขององค์ประกอบเหล่านี้
ดังนั้นนักพัฒนาอื่น ๆ สามารถต้องให้ฟังก์ชั่นการเปรียบเทียบเมื่อใช้ฟังก์ชั่นการเรียงลำดับเพื่อให้เราสามารถใช้เปรียบเทียบเพื่อเปรียบเทียบขนาดขององค์ประกอบที่จะจัดเรียงโดยไม่ทราบล่วงหน้าว่าองค์ประกอบประเภทใดคืออะไร
ที่นี่ฟังก์ชั่นการเปรียบเทียบเป็นฟังก์ชั่นการเรียกกลับสำหรับฟังก์ชันการเรียงลำดับ
รหัสหลอกจะแสดงดังนี้:
// ฟังก์ชั่นการเรียงลำดับทั่วไปเป็นโมฆะ (อาร์เรย์ [] อาร์เรย์, วิธีการเปรียบเทียบ) {// ใช้ฟังก์ชันเปรียบเทียบเพื่อเปรียบเทียบความสัมพันธ์ขนาดขององค์ประกอบในอาร์เรย์ // เรียงลำดับอาร์เรย์} // ฟังก์ชั่นการเปรียบเทียบที่เฉพาะเจาะจงถูกนำไปใช้ตัวอย่างฟังก์ชั่นการประมวลผลแบบอะซิงโครนัส
ตัวอย่างเช่นเมื่อเราเขียนฟังก์ชั่นการประมวลผลแบบอะซิงโครนัสเราไม่ทราบล่วงหน้าว่านักพัฒนาคนอื่นควรทำอะไรเมื่อการประมวลผลเสร็จสมบูรณ์เนื่องจากการดำเนินการเหล่านี้สามารถรู้จักได้เมื่อใช้ฟังก์ชันในสถานการณ์เฉพาะ
ดังนั้นนักพัฒนาสามารถจำเป็นต้องให้ฟังก์ชั่นการโทรกลับเมื่อใช้ฟังก์ชั่นนี้ ด้วยวิธีนี้เมื่อเราเขียนฟังก์ชั่นการประมวลผลแบบอะซิงโครนัสเราสามารถโทรหาฟังก์ชั่นการโทรกลับเพื่อทำงานขั้นสุดท้ายโดยไม่ทราบว่างานสุดท้ายเหล่านี้เป็นอย่างไรล่วงหน้า
รหัสหลอกจะแสดงดังนี้:
// ฟังก์ชั่นการประมวลผล async เป็นโมฆะ asynprocess (วิธีการโทรกลับ) {// เรียกใช้งานการเรียกกลับงานแบบอะซิงโครนัส ();} // ฟังก์ชั่นการโทรกลับที่เฉพาะเจาะจงเป็นโมฆะการเรียกกลับ () จะดำเนินการโดยผู้โทร {// การดำเนินการที่จะดำเนินการหลังจากการประมวลผลแบบอะซิงโครนัสเสร็จสมบูรณ์}}3. ใช้อินเตอร์เฟสแทนการเรียกกลับฟังก์ชั่น
เราได้กล่าวถึงข้างต้นว่าเหตุผลที่ใช้การเรียกกลับฟังก์ชั่นเป็นเพราะเราไม่ทราบว่าการใช้งานเฉพาะของฟังก์ชั่นบางอย่างล่วงหน้าดังนั้นการใช้งานที่เฉพาะเจาะจงจึงถูกทิ้งให้นักพัฒนาอื่น ๆ ให้เสร็จสมบูรณ์
คุณคิดว่าประโยคนี้ดูเหมือนจะอธิบายอินเทอร์เฟซ Java หรือไม่? อินเทอร์เฟซเป็นคำจำกัดความที่เป็นนามธรรมของชุดของวิธีการและการใช้งานเฉพาะจะเสร็จสมบูรณ์โดยคลาสที่ใช้อินเทอร์เฟซ
ดังนั้นการใช้สองลักษณะของวัตถุที่เน้นวัตถุและอินเทอร์เฟซจึงสามารถเปลี่ยนการเรียกกลับฟังก์ชั่นได้
เราให้ทั้งสองตัวอย่างข้างต้นเพื่อแสดงให้เห็นว่าอินเทอร์เฟซแทนที่การเรียกกลับฟังก์ชั่นอย่างไร
เรียงลำดับฟังก์ชั่น
การใช้อินเทอร์เฟซเพื่อใช้ฟังก์ชั่นการเรียงลำดับไม่จำเป็นต้องมีนักพัฒนาอีกต่อไปเพื่อให้ฟังก์ชั่นการโทรกลับเปรียบเทียบเมื่อใช้ฟังก์ชั่นการเรียงลำดับ แต่ต้องการนักพัฒนาเพื่อให้แน่ใจว่าองค์ประกอบที่จะจัดเรียงจะใช้อินเทอร์เฟซที่เปรียบเทียบได้ จากหลักฐานว่า "องค์ประกอบที่จะจัดเรียงได้นำไปใช้อินเทอร์เฟซที่เปรียบเทียบได้แล้ว" เราสามารถใช้ฟังก์ชั่นการเรียงลำดับโดยไม่ทราบประเภทขององค์ประกอบที่จะจัดเรียง
// ฟังก์ชั่นการเรียงลำดับทั่วไปเป็นโมฆะเรียงลำดับ (อาร์เรย์ [] อาร์เรย์) {// ใช้วิธีการเปรียบเทียบอินเตอร์เฟสเปรียบเทียบ // เปรียบเทียบขนาดขององค์ประกอบเพื่อเรียงลำดับอาร์เรย์ } // อินเทอร์เฟซที่กำหนดโดยฟังก์ชั่นการเรียงลำดับส่วนต่อประสานสาธารณะเปรียบเทียบได้ {public int compereto (วัตถุอื่น ๆ );} // ใช้อินเตอร์เฟสที่เปรียบเทียบได้องค์ประกอบระดับสาธารณะที่เปรียบเทียบได้ {@Override public int compereto (วัตถุอื่น ๆ ) {// ตัดสินความสัมพันธ์ขนาดปัจจุบันระหว่างองค์ประกอบและอื่น ๆฟังก์ชั่นการประมวลผลแบบอะซิงโครนัส
เมื่อใช้อินเทอร์เฟซเพื่อใช้ฟังก์ชั่นการประมวลผลแบบอะซิงโครนัสผู้พัฒนาไม่จำเป็นต้องใช้ฟังก์ชั่นการโทรกลับ แต่ต้องการวัตถุที่ใช้อินเทอร์เฟซที่ระบุซึ่งสะท้อนแนวคิดเชิงวัตถุ Java เมื่อเปรียบเทียบกับการจัดหาฟังก์ชั่นวัตถุมีข้อมูลเพิ่มเติมและมีความยืดหยุ่นในการใช้งานมากขึ้น แต่โดยพื้นฐานแล้วฟังก์ชั่นการประมวลผลแบบอะซิงโครนัสนี้ยังคงใช้อินเทอร์เฟซเพื่อทำงานให้เสร็จ
// ฟังก์ชั่นการประมวลผล async เป็นโมฆะ asynprocess (actionListener al) {// ดำเนินการงานแบบอะซิงโครนัส al.actionperformed ();} // อินเตอร์เฟสที่กำหนดโดยฟังก์ชั่นการประมวลผลแบบอะซิงโครนัส ActionPerformed () {// งานพิเศษที่จำเป็นเมื่อฟังก์ชั่นการประมวลผลแบบอะซิงโครนัสเสร็จสมบูรณ์}} // การเรียกฟังก์ชั่นการประมวลผลแบบอะซิงโครนัสโมฆะสาธารณะคงที่หลัก (สตริง [] args) {asynprocess4. สรุป
วิธีการโทรกลับสามารถสรุปได้ว่า: การใช้งานฟังก์ชั่นทั่วไป func เมื่อเรียกใช้ฟังก์ชั่นทั่วไปนี้ในสถานการณ์ที่เฉพาะเจาะจงผู้โทรจะต้องให้ฟังก์ชั่นการโทรกลับที่เหมาะสม ฟังก์ชั่นทั่วไป Func ใช้ฟังก์ชั่นการโทรกลับนี้เพื่อทำงานให้เสร็จในสถานการณ์เฉพาะ
วิธีการใช้อินเทอร์เฟซคือ: ใช้ฟังก์ชั่นทั่วไป func เมื่อเรียกฟังก์ชั่นทั่วไปนี้ในสถานการณ์เฉพาะวัตถุที่ดำเนินการต้องใช้ในการใช้อินเทอร์เฟซที่เหมาะสมด้วยตัวเอง ฟังก์ชั่นทั่วไปจะใช้อินเทอร์เฟซนี้เพื่อทำงานให้เสร็จสมบูรณ์ในสถานการณ์เฉพาะ
การใช้การเรียกใช้ฟังก์ชั่นหรืออินเทอร์เฟซสามารถแก้สถานการณ์ที่คุณไม่ทราบการใช้งานเฉพาะล่วงหน้า วิธีการโทรกลับฟังก์ชั่นส่งผ่านฟังก์ชั่นในขณะที่วิธีการอินเตอร์เฟสส่งผ่านวัตถุที่ใช้อินเตอร์เฟส
ใน Java การเรียกกลับฟังก์ชั่นจะต้องเสร็จสิ้นโดยใช้กลไกการสะท้อนกลับซึ่งมีแนวโน้มที่จะเกิดข้อผิดพลาดและไม่มีประสิทธิภาพ การใช้อินเทอร์เฟซสามารถทำให้ตรรกะของรหัสชัดเจนขึ้นมีประสิทธิภาพมากขึ้นและดีขึ้นในการแก้ไขข้อบกพร่อง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น