Java 無函數指針,回調通過接口 + 多態模擬。本文從 C/C++ 函數指針、C# 委托對比切入,層層遞進構建 Java 回調模型:定義接口 → 實現類 → 接口引用持有實現對象 → 目標方法調用接口方法,並展示帶事件觸發條件的 Controller 模式,直擊 Android OnClickListener、Runnable 等核心場景。
將「做什麼」與「何時做」解耦。被調用者不關心具體邏輯,只在特定時機觸發契約方法,實現邏輯可插拔。
interface Callback { void onEvent(); }
class MyHandler implements Callback {
public void onEvent() { System.out.println("handle"); }
}
class Invoker {
private Callback cb;
public Invoker(Callback cb) { this.cb = cb; }
public void trigger() { if (cb != null) cb.onEvent(); }
}
class Controller {
private Callback callback;
private boolean eventHappened;
public Controller(Callback cb) { this.callback = cb; }
public void doSomething() {
if (eventHappened) callback.onEvent();
}
}
此處若直接依賴 MyHandler 而非接口,則退化為硬編碼,喪失擴展性。
new Controller(new Callback() {
@Override public void onEvent() { System.out.println("anonymous"); }
}).doSomething();
View.setOnClickListener(new OnClickListener() { ... }) → 接口 OnClickListener、實現類匿名內部類、觸發點在 View.performClick()。new Thread(new Runnable() { ... }).start() → 接口 Runnable、線程啟動時回調 run()。掌握此模式,即掌握了 Java 事件驅動、異步回調、插件化架構的基因密碼。