모듈 간에는 항상 이러한 특정 인터페이스가 있습니다. 통화 방법의 관점에서, 동기 호출, 콜백 및 비동기 통화의 세 가지 범주로 나눌 수 있습니다. 다음은 콜백 메커니즘을 자세히 설명하는 데 중점을 둡니다.
1. 개요
Java의 콜백 메커니즘은 비교적 일반적인 메커니즘이지만 프로그램에서는 덜 사용될 수 있으며 콜백 메커니즘은 일부 큰 프레임 워크의 어느 곳에서나 볼 수 있습니다. 이 기사는 특정 예제를 사용하여 Java의 콜백 메커니즘에 천천히 더 가까워집니다.
2. 콜백
소위 콜백 : 클래스 B의 클래스 A에서 메소드 C를 호출 한 다음 클래스 B 클래스 B의 클래스 A에서 메소드 D를 호출하는 것을 의미합니다.이 방법 D를 콜백 메소드라고합니다. 실제로 사용하면 다음과 같은 콜백 양식이 있습니다.
2.1 동기 콜백
여기서 나는 그런 상황을 가정합니다.
회사 A의 이사 B는 자신의 부하 (프로젝트 관리자 C)에 설문 조사를하고 싶다고 말했지만 C는 직접 할 필요가 없었습니다. C 매니저 C는 그의 프로그래머 D를 완료하도록 준비하도록 요청받을 수 있습니다. C 관리자는 프로그래머 D를 발견하고 그에게 연구 과제가 이제 완료 될 것이라고 말했습니다. 그리고 관리자에게 설문 조사 결과를 알려주십시오. 문제가있는 경우에도 계속해야합니다. 여기에 c가 무언가를하도록 요청하는 것이 있기 때문에, 그 후에도 결과를 C와 전달해야합니다. 이것이 콜백 모델입니다. 다음은 일반 콜백 클래스 다이어그램입니다.
먼저 콜백 인터페이스 콜백 인터페이스가 필요합니다
Callbackinterface.java
공개 인터페이스 Callbackinterface {public boolean check (int result);} 백그라운드에서 프로그래머 D는 결과를 프로젝트 관리자 C와 통신하려고하므로 프로젝트 관리자는 위의 콜백 인터페이스를 구현해야합니다.
Manager.java
공개 클래스 관리자는 Callbackinterface {개인 프로그래머 프로그래머 = NULL을 구현합니다. 공개 관리자 (프로그래머 _programmer) {this.programmer = _programmer; } / *** 보스가 발행 한 대표단* / public void intrust () {ratement (); } // 작업 작업을 공부하기 위해 부하 직원 일정 개인 무효 계약 () {System.out.println ( "관리자는 프로그래머를위한 작업을 정리하고 있습니다"); Programmer.study (관리자); System.out.println ( "프로그래머 작업 일정이 완료되었고 관리자는 다른 일을하기 위해 갔다"); } @override public boolean check (int result) {if (result == 5) {return true; } false를 반환합니다. }} 프로그래머 D의 경우, 그는 자신과 의사 소통하기 위해 C 관리자 C로부터 견적을 보유해야합니다. 그러나 다음은 B 이사가 C 감독 C에게 주선을 요청한 과제입니다. 다시 말해, 관리자 B1, B2 등과 같은 다른 관리자도 여기에서 요청할 수 있습니다. 관리자는 콜백 인터페이스를 구현 했으므로 프로그래머 D 가이 인터페이스를 여기에서 직접 유지하게 할 수 있습니다. 다음과 같이 :
프로그래머. 자바
공개 클래스 프로그래머 {public void Study (Callbackinterface Callback) {int result = 0; {result ++; System.out.println ( "Th" + result + "연구 결과"); } while (! callback.check (결과)); System.out.println ( "설문 조사 작업 종료"); }} 감독은 클라이언트 테스트와 동일하기 때문에 감독에게는 훨씬 간단하고 명확합니다.
보스. 자바
Public Class Boss {public static void main (String [] args) {manager manager = new Manager (new 프로그래머 ()); manager.entrust (); }} 실행 결과 :
관리자는 프로그래머를위한 작업을 준비하고 있습니다. 첫 번째 연구 결과. 두 번째 연구 결과. 세 번째 연구 결과. 4 번째 연구 결과. 5 번째 연구 결과. 5 번째 연구. 프로그래머를위한 일정 작업이 완료되었습니다. 관리자는 다른 일을했습니다.
2.2 비동기 콜백
위의 예에 대해서는 프로젝트 관리자가 항상 연구 결과를 기다릴 수 없습니다. 그러나 당신 이이 과제를 당신에게 넘겨 준 후에, 그는 그것을 무시할 것입니다. 그는 자신의 일을 할 것이고, 당신은 당신의 일을 할 것입니다. 따라서 콜백 함수는 여기서 비동기식으로 처리되어야합니다.
따라서 여기서는 프로그래머 클래스의 코드를 수정하고 다음과 같이 수정해야합니다.
프로그래머. 자바
공개 클래스 프로그래머 {public 프로그래머 () {} public void Study (Callbackinterface Callback) {New StudyThread (Callback) .start (); } // --------------------------- Programmer 正在做的工作--------------------------- class StudyThread extends Thread { CallbackInterface callback = null; public studythread (callbackinterface _callback) {callback = _callback; } @override public void run () {int result = 0; {result ++; System.out.println ( "Th" + result + "연구 결과"); } while (! callback.check (결과)); System.out.println ( "설문 조사 작업 종료"); }}}실행 결과 :
매니저는 프로그래머를위한 일정 일정 작업 중입니다. 프로그래머를위한 스케줄링 작업이 완료되었으며 관리자는 다른 일을하고 있습니다.
제 5 학년 연구 결과의 제 3 연구 결과에 대한 두 번째 연구 결과의 첫 번째 연구 결과 결과 연구 과제가 끝났습니다.
2.3 폐쇄 및 콜백
클로저는 생성 된 범위에서 일부 정보를 기록하는 호출 가능한 객체입니다.
2.3.1 일반 통화
먼저, 우리는 정상적인 상황에서 전화가 어떻게 이루어 지는지 확인할 수 있습니다.
증분 가능. 자바
인터페이스 증분 가능 {void excrement ();}이것은 일반적인 인터페이스입니다 (일반적인 호출의 일반적인 인터페이스 일 뿐이며 콜백의 콜백 인터페이스이며 이해하기 쉽습니다).
Callee1.java
클래스 Callee1은 증분 가능성 {private int i = 0; @override public void ycrement () {i ++; System.out.println (i); }}콜백 .java
공개 클래스 콜백 {public static void main (String [] args) {callee1 callee1 = new callee1 (); callee1.increment (); }}콜백은 테스트 클라이언트 클래스이며 할 말이 없습니다. 위의 코드를 살펴보십시오.
2.3.2 콜백 초기 시험
정상적인 Java 프로그래머의 경우 생각없이 할 수있는 일이어야하기 때문에 위의 일반적인 전화에 대해 할 말이 없습니다.
이제 콜백을 형성하려면 프로그램의 구조 또는 논리 측면에서 하나의 Callee (콜백 객체 Callee1) 만 갖는 것은 불가능하며 발신자 객체도 필요합니다. 발신자는 다음과 같이 쓸 수 있습니다.
발신자. 자바
클래스 발신자 {개인 증분 가능한 콜백 레퍼먼트; 공개 발신자 (증분 가능한 _callbackReference) {CallBackReference = _callbackReference; } void go () {callbackreference.increment (); }} 여기에서 발신자는 위에서 언급 한 프로그래머가 프로젝트 관리자의 참조를 보유 해야하는 것처럼 콜백 인터페이스에 대한 콜백 레퍼런스를 보유 하여이 참조를 통해 프로젝트 관리자와 통신 할 수 있습니다. 여기서 콜백 리퍼 감소 도이 역할을합니다.
이제 시험 수업의 글을 살펴 보겠습니다.
콜백 .java
공개 클래스 콜백 {public static void main (String [] args) {callee1 callee1 = new callee1 (); 발신자 발신자 1 = 새로운 발신자 (Callee1); caller1.go (); }}지금까지 프로그램 코드의 경우 Project Manager가 프로그래머를 사용하여 기술적 문제를 조사하도록 위의 코드를 완전히 비교할 수 있습니다. 동일한 효과가 있습니다.
2.3.3 폐쇄 콜백
정상 콜백과 비교하여 클로저 콜백의 핵심은 자연스럽게 폐쇄에 놓여 있습니다. 즉, 범위를 제어합니다.
이제 사용자 (기타 프로그래머)가 MyIncrement 클래스를 사용자 정의하고 증분 방법을 포함한다고 가정합니다. 다음과 같이 :
클래스 myIncrement {public void ycrement () {system.out.println ( "mycrement.increment"); } static void f (myIncrement 증가) {ycrement.increment (); }}위의 클래스에서 상속 된 또 다른 클래스 Callee2가 있습니다.
클래스 callee2는 myincrement {private int i = 0; public void ycrement () {super.increment (); i ++; System.out.println (i); }}여기에서 increment () 메소드를 호출하려면 일반적인 기능 호출이됩니다. 따라서 여기서는 위의 Callee2 클래스를 수정해야합니다. 수정의 목표는 Callee2 클래스를 MyIncrement 클래스의 excrement () 메소드와 함께 호환하여 증분 가능의 increment () 메소드를 만드는 것입니다. 수정 후 :
클래스 callee2는 myincrement {private int i = 0; public void ycrement () {super.increment (); i ++; System.out.println (i); } 개인 클래스 클로저는 증분 가능성 {@override public void ycrement () {callee2.this.increment (); }} ycrementable getCallbackReference () {return new Closure (); }} 여기서 폐쇄 클래스는 개인 클래스이며, 이는 폐쇄의 요소입니다. 클로저 클래스는 비공개이므로 폐쇄 오브젝트의 작업을위한 열린 인터페이스가 있어야합니다. 위의 getCallbackReference () 메소드입니다. 발신자 클래스는 변경되지 않았습니다.
클라이언트를 테스트하려면 코드를보십시오.
공개 클래스 콜백 {public static void main (string [] args) {callee2 callee2 = new Callee2 (); 발신자 caller2 = 새 발신자 (callee2.getCallbackReference ()); caller2.go (); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.