利用java的接口實現回調

onclick,onfocus,onload,oncreate......
咱們在java GUI 編程、js事件、android組建中經常見到這些單詞,這些函數就是回調函數。C語言利用指針實現回調,與面向對象的語言不一樣。咱們這裏介紹利用java的接口實現回調的方法。java

回調是一種雙向的調用模式,例如咱們要調用B的一個特定的方法,B在執行完又要調用A的一個方法,而這個A(或者說A的這個方法)是由咱們本身實現的。因此能夠這樣理解:「回調函數也是一個函數或過程,不過它是一個由調用方本身實現,供被調用方使用的特殊函數。」android

不過,有了面向對象的機制後,咱們就能夠輕鬆地使用這套機制來實現回調了,讓回調變得簡單。編程

例子:ide

package com.yawn.callback;

/**
 * 回調要達到的效果就是在執行完b的go方法以後,再自動調用咱們本身實現的onFinish方法
 * A能夠是任何一個實現了Finish接口的類,用於存放咱們實現的onFinish方法
 * 
 * @author yawn
 *
 */
public class CallBack {
	public static void main(String[] args) {
		B b = new B(new A()); // 初始化B並指定B所要回調的對象(方法)
		b.go();
	}
}

class A implements Finish{
	@Override
	public void onFinish() {
		System.out.println("finish");
	}
}
package com.yawn.callback;

/**
 * B的內部實現也很簡單,只須要一個接口類型的成員變量(這個成員變量的具體實現由咱們初始化B時指定),
 * 在執行方法完成時調用這個成員變量(接口對象)的onFinish方法便可
 * 
 * @author yawn
 *
 */
public class B {
	Finish f ;
	public B(Finish f){
		this.f = f;
	}
	void go(){
		System.out.println("Go go go!");
		if (f != null){
			f.onFinish();
		}
	}
}
package com.yawn.callback;

public interface Finish {
	void onFinish();
}

這樣就能夠在調用B的go方法以後又調用咱們實現的onFinish方法了。函數

運行結果
Go go go!
finish

其實在初始化B時不必定要實現一個類A,也能夠直接實現接口中的方法:this

package com.yawn.callback;

/**
 * 回調要達到的效果就是在執行完b的go方法以後,再自動調用咱們本身實現的onClick方法
 * A能夠是任何一個實現了Finish接口的類,用於存放咱們實現的onFinish方法
 * 
 * @author yawn
 *
 */
public class CallBack {
	public static void main(String[] args) {
		B b = new B(new Finish() {
			@Override
			public void onFinish() {
				System.out.println("finish");
			}
		});
		b.go();
	}
}
相關文章
相關標籤/搜索