มีอินเทอร์เฟซบางอย่างระหว่างโมดูลเสมอ จากมุมมองของวิธีการโทรพวกเขาสามารถแบ่งออกเป็นสามประเภท: การโทรแบบซิงโครนัสการโทรกลับและการโทรแบบอะซิงโครนัส ต่อไปนี้มุ่งเน้นไปที่การอธิบายกลไกการโทรกลับโดยละเอียด
1. ภาพรวม
กลไกการโทรกลับใน Java เป็นกลไกที่พบบ่อย แต่อาจใช้น้อยลงในโปรแกรมของคุณและกลไกการโทรกลับสามารถมองเห็นได้ทุกที่ในกรอบขนาดใหญ่ บทความนี้ใช้ตัวอย่างเฉพาะบางอย่างเพื่อเข้าใกล้กลไกการโทรกลับของ Java อย่างช้าๆ
2. โทรกลับ
การเรียกกลับที่เรียกว่า: มันหมายถึงการเรียกวิธี C ในคลาส A ในคลาส B จากนั้นเรียกวิธีการ d ในคลาส A ในคลาส B ในคลาส B วิธีนี้ D นี้เรียกว่าวิธีการโทรกลับ เมื่อใช้จริงจะมีรูปแบบการโทรกลับที่แตกต่างกันเช่นรูปแบบต่อไปนี้
2.1 การโทรกลับแบบซิงโครนัส
ที่นี่ฉันถือว่าสถานการณ์เช่นนี้
ผู้อำนวยการ บริษัท A ของ บริษัท A บอกกับผู้ใต้บังคับบัญชาของเขา (ผู้จัดการโครงการ C) ว่าเขาต้องการทำการสำรวจ แต่ C ไม่จำเป็นต้องทำด้วยตัวเอง Manager C สามารถขอให้จัดให้โปรแกรมเมอร์ D ของเขาเสร็จสมบูรณ์ ผู้จัดการ C พบโปรแกรมเมอร์ D และบอกเขาว่างานวิจัยจะเสร็จสมบูรณ์ในขณะนี้ และบอกผู้จัดการ C ผลการสำรวจ หากมีปัญหาใด ๆ คุณยังต้องดำเนินการต่อ เพราะนี่คือ C ขอให้ทำอะไรบางอย่าง D ยังคงต้องสื่อสารผลลัพธ์กับ C หลังจากนั้น นี่คือรูปแบบการโทรกลับ ต่อไปนี้เป็นแผนภาพคลาสโทรกลับทั่วไป:
ก่อนอื่นเราจำเป็นต้องมีการเรียกกลับ breackInterface
callbackinterface.java
อินเทอร์เฟซสาธารณะ callbackinterface {การตรวจสอบบูลีนสาธารณะ (ผลลัพธ์ int);} ในพื้นหลังโปรแกรมเมอร์ D ต้องการสื่อสารผลลัพธ์กับ Project Manager C ดังนั้นผู้จัดการโครงการจึงต้องใช้อินเตอร์เฟสการโทรกลับข้างต้น:
Manager.java
ตัวจัดการคลาสสาธารณะใช้ CallBackInterFace {Private Programmer Programmer = NULL; ผู้จัดการสาธารณะ (โปรแกรมเมอร์ _programmer) {this.programmer = _programmer; } / *** ใช้สำหรับการมอบหมายที่ออกโดยหัวหน้า* / public void entrust () {การจัดเรียง (); } // กำหนดการย่อยเพื่อศึกษางานโมฆะส่วนตัวจัดเรียง () {system.out.println ("ผู้จัดการกำลังจัดงานสำหรับโปรแกรมเมอร์"); Programmer.study (manager.his); System.out.println ("กำหนดการทำงานสำหรับโปรแกรมเมอร์เสร็จสมบูรณ์และผู้จัดการได้ไปทำสิ่งอื่น ๆ "); } @Override การตรวจสอบบูลีนสาธารณะ (ผลลัพธ์ int) {ถ้า (ผลลัพธ์ == 5) {return true; } return false; - สำหรับโปรแกรมเมอร์ D เขาต้องมีใบเสนอราคาจากผู้จัดการ C เพื่อสื่อสารกับเขา อย่างไรก็ตามนี่คืองานที่ผู้อำนวยการ B ขอให้ผู้จัดการ C จัดเรียง กล่าวอีกนัยหนึ่งผู้จัดการคนอื่น ๆ สามารถถามได้ที่นี่เช่นผู้จัดการ B1, B2 ฯลฯ เนื่องจากผู้จัดการได้ใช้อินเทอร์เฟซการโทรกลับคุณสามารถปล่อยให้โปรแกรมเมอร์ D ถืออินเทอร์เฟซนี้ได้ที่นี่ ดังนี้:
โปรแกรมเมอร์. java
โปรแกรมเมอร์คลาสสาธารณะ {การศึกษาโมฆะสาธารณะ (การเรียกกลับ backinterface) {int result = 0; ทำ {ผลลัพธ์ ++; System.out.println ("th" + ผลลัพธ์ + "ผลลัพธ์ของการศึกษา"); } ในขณะที่ (! callback.check (ผลลัพธ์)); System.out.println ("งานสำรวจสิ้นสุด"); - มันง่ายกว่าและชัดเจนกว่าสำหรับผู้อำนวยการเพราะสิ่งนี้เทียบเท่ากับการทดสอบลูกค้า:
boss.java
เจ้านายระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {manager manager = ผู้จัดการใหม่ (โปรแกรมเมอร์ใหม่ ()); manager.entrust (); - ผลการทำงาน:
ผู้จัดการกำลังจัดงานสำหรับโปรแกรมเมอร์ ผลการศึกษาครั้งที่ 1 ผลการศึกษาครั้งที่ 2 ผลการศึกษาครั้งที่ 3 ผลการศึกษาครั้งที่ 4 ผลการศึกษาครั้งที่ 5 การศึกษาครั้งที่ 5 งานกำหนดเวลาสำหรับโปรแกรมเมอร์เสร็จสมบูรณ์แล้ว ผู้จัดการได้ทำสิ่งอื่น ๆ
2.2 การโทรกลับแบบอะซิงโครนัส
สำหรับตัวอย่างข้างต้นผู้จัดการโครงการของคุณไม่สามารถรอผลการวิจัยของคุณได้เสมอ แต่หลังจากที่คุณมอบงานนี้ให้คุณเขาจะไม่สนใจมัน เขาจะทำสิ่งที่เขาทำเองคุณจะทำสิ่งของคุณเอง ดังนั้นฟังก์ชั่นการโทรกลับจะต้องดำเนินการแบบอะซิงโครนัสที่นี่
ดังนั้นที่นี่เราต้องแก้ไขรหัสของคลาสโปรแกรมเมอร์และแก้ไขดังนี้:
โปรแกรมเมอร์. java
โปรแกรมเมอร์คลาสสาธารณะ {โปรแกรมเมอร์สาธารณะ () {} การศึกษาโมฆะสาธารณะ (การเรียกกลับ backinterface) {ใหม่ chestionThread (การโทรกลับ). start (); } // --------------------------- โปรแกรมเมอร์正在做的工作 --------------------------- คลาสการศึกษา studyThread ขยายเธรด {callbackinterface callback = null; Public StudyThread (callbackinterface _callback) {callback = _callback; } @Override โมฆะสาธารณะเรียกใช้ () {int result = 0; ทำ {ผลลัพธ์ ++; System.out.println ("th" + ผลลัพธ์ + "ผลลัพธ์ของการศึกษา"); } ในขณะที่ (! callback.check (ผลลัพธ์)); System.out.println ("งานสำรวจสิ้นสุด"); -ผลการทำงาน:
Manager กำลังกำหนดเวลาทำงานให้กับโปรแกรมเมอร์งานกำหนดเวลาสำหรับโปรแกรมเมอร์เสร็จสมบูรณ์และผู้จัดการกำลังทำสิ่งอื่น ๆ
ผลการศึกษาครั้งที่ 1 ของผลการศึกษาครั้งที่ 2 ของผลการศึกษาครั้งที่ 3 ของผลการศึกษาครั้งที่ 4 ของการศึกษาครั้งที่ 5 งานวิจัยสิ้นสุดลง
2.3 การปิดและการโทรกลับ
การปิดเป็นวัตถุที่เรียกได้ซึ่งบันทึกข้อมูลบางอย่างจากขอบเขตที่สร้างขึ้น
2.3.1 การโทรปกติ
ก่อนอื่นเราจะเห็นว่าการโทรเกิดขึ้นภายใต้สถานการณ์ปกติอย่างไร
เพิ่มได้. java
อินเตอร์เฟสที่เพิ่มขึ้น {void uprement ();}นี่เป็นอินเทอร์เฟซธรรมดา (เป็นเพียงอินเทอร์เฟซปกติในการโทรทั่วไปและเป็นอินเทอร์เฟซการโทรกลับในการโทรกลับซึ่งควรเข้าใจง่าย)
Callee1.java
Class Callee1 ใช้งานที่เพิ่มขึ้น {private int i = 0; @Override โมฆะสาธารณะเพิ่มขึ้น () {i ++; System.out.println (i); -การโทรกลับ
การเรียกกลับคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {callee1 callee1 = new callee1 (); Callee1.increment (); -การโทรกลับเป็นคลาสไคลเอนต์ทดสอบไม่มีอะไรจะพูดเพียงแค่ดูรหัสด้านบน
2.3.2 การทดลองเริ่มต้นการโทรกลับ
ไม่มีอะไรจะพูดเกี่ยวกับการโทรธรรมดาข้างต้นเพราะสำหรับโปรแกรมเมอร์ Java ปกตินี่ควรเป็นสิ่งที่สามารถทำได้โดยไม่ต้องคิด
ตอนนี้ถ้าคุณต้องการสร้างการโทรกลับมันเป็นไปไม่ได้ที่จะมีเพียงหนึ่ง callee (วัตถุโทรกลับ callee1) ในแง่ของโครงสร้างหรือตรรกะของโปรแกรมและคุณยังต้องมีวัตถุผู้โทร ผู้โทรสามารถเขียนได้เช่นนี้:
caller.java
ผู้โทรในชั้นเรียน {callbackreference ส่วนตัวที่เพิ่มขึ้นได้; ผู้โทรสาธารณะ (เพิ่ม _CallBackReference) {callBackReference = _CallBackReference; } void go () {callbackreference.increment (); - ที่นี่ผู้โทรมีการเรียกร้องการเรียกกลับสำหรับอินเทอร์เฟซการโทรกลับเช่นเดียวกับโปรแกรมเมอร์ที่กล่าวถึงข้างต้นจำเป็นต้องเก็บข้อมูลอ้างอิงของผู้จัดการโครงการเพื่อให้คุณสามารถสื่อสารกับผู้จัดการโครงการผ่านการอ้างอิงนี้ การเรียกกลับที่นี่ยังมีบทบาทนี้
ตอนนี้มาดูการเขียนของคลาสทดสอบ:
การโทรกลับ
การเรียกกลับคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {callee1 callee1 = new callee1 (); Caller Caller1 = ผู้โทรใหม่ (Callee1); caller1.go (); -สำหรับรหัสโปรแกรมจนถึงตอนนี้เราสามารถเปรียบเทียบรหัสด้านบนอย่างสมบูรณ์ซึ่งผู้จัดการโครงการจัดโปรแกรมโปรแกรมเมอร์เพื่อตรวจสอบปัญหาทางเทคนิค มันมีผลเหมือนกัน
2.3.3 การโทรกลับ
เมื่อเทียบกับการโทรกลับปกติแกนกลางของการโทรกลับปิดอยู่ในการปิดตามธรรมชาตินั่นคือการควบคุมขอบเขต
ตอนนี้สมมติว่าผู้ใช้ (โปรแกรมเมอร์อื่น ๆ ) ปรับแต่งคลาส myincrement และรวมถึงวิธีการเพิ่มขึ้น ดังนี้:
คลาส myincrement {โมฆะสาธารณะเพิ่มขึ้น () {system.out.println ("mycrement.increment"); } โมฆะคงที่ F (การเพิ่มขึ้นของ myIncrement) {increment.increment (); -มีคลาสอื่น Callee2 ที่สืบทอดมาจากคลาสข้างต้น:
Class Callee2 ขยาย myincrement {ส่วนตัว int i = 0; การเพิ่มขึ้นของโมฆะสาธารณะ () {super.increment (); i ++; System.out.println (i); -เห็นได้ชัดว่าหากคุณต้องการเรียกวิธีการเพิ่ม () ที่นี่มันจะกลายเป็นฟังก์ชั่นทั่วไป ดังนั้นที่นี่เราต้องปรับเปลี่ยนคลาส Callee2 ด้านบน เป้าหมายของการดัดแปลงคือการทำให้คลาส Callee2 เข้ากันได้กับวิธีการเพิ่ม () ของคลาส myincrement และวิธีการเพิ่มขึ้น () ของวิธีที่เพิ่มขึ้น หลังจากการแก้ไข:
Class Callee2 ขยาย myincrement {ส่วนตัว int i = 0; การเพิ่มขึ้นของโมฆะสาธารณะ () {super.increment (); i ++; System.out.println (i); } การปิดคลาสส่วนตัวดำเนินการเพิ่มขึ้น {@Override โมฆะสาธารณะเพิ่มขึ้น () {callee2.this.increment (); }} เพิ่ม getCallBackReference () {return new closure (); - โปรดทราบว่าคลาสปิดที่นี่เป็นคลาสส่วนตัวซึ่งเป็นองค์ประกอบของการปิด เนื่องจากคลาสปิดเป็นส่วนตัวจึงต้องมีอินเทอร์เฟซแบบเปิดสำหรับการดำเนินการบนวัตถุปิด นี่คือวิธี getCallBackReference () ด้านบน คลาสผู้โทรไม่เปลี่ยนแปลง
สำหรับการทดสอบลูกค้าเพียงดูรหัส:
การเรียกกลับคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {callee2 callee2 = new callee2 (); Caller Caller2 = ผู้โทรใหม่ (callee2.getCallBackReference ()); caller2.go (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น