回调接口的核心概念
回调接口本质是观察者模式的简化,包含两个角色:
- 定义者:声明回调方法的接口
- 调用者:持有接口引用,在特定事件触发时调用方法
- 实现者:提供接口的具体实现
// 1. 定义回调接口 public interface PaymentCallback { void onSuccess(String transactionId); // 成功回调 void onFailure(String errorMessage); // 失败回调 }
为什么需要回调接口?
- 解耦:调用方无需关心具体实现逻辑
- 异步通知:非阻塞式处理耗时操作(如网络请求)
- 扩展性:新增回调逻辑不影响原有代码
- 事件驱动:响应按钮点击、支付结果等场景
实现回调接口的4个步骤
步骤1:定义接口
public interface DownloadCallback { void onProgress(int percent); // 下载进度 void onComplete(File file); // 下载完成 void onError(Exception e); // 下载异常 }
步骤2:调用者接收并触发回调
public class FileDownloader { private DownloadCallback callback; // 注册回调接口 public void setCallback(DownloadCallback callback) { this.callback = callback; } public void startDownload(String url) { new Thread(() -> { try { for (int i = 0; i <= 100; i += 10) { Thread.sleep(300); // 模拟下载耗时 callback.onProgress(i); // 触发进度回调 } callback.onComplete(new File("downloaded_file.txt")); // 完成回调 } catch (Exception e) { callback.onError(e); // 异常回调 } }).start(); } }
步骤3:实现回调逻辑
public class AppHandler implements DownloadCallback { @Override public void onProgress(int percent) { System.out.println("下载进度: " + percent + "%"); } @Override public void onComplete(File file) { System.out.println("文件下载完成: " + file.getName()); } @Override public void onError(Exception e) { System.err.println("下载失败: " + e.getMessage()); } }
步骤4:使用回调
public class Main { public static void main(String[] args) { FileDownloader downloader = new FileDownloader(); downloader.setCallback(new AppHandler()); // 注入回调实现 downloader.startDownload("https://example.com/file.txt"); } }
实际应用场景
- GUI事件处理:Android点击事件
OnClickListener
- 异步任务:网络请求结果回调
- 支付系统:支付成功/失败通知
- 框架扩展点:Spring InitializingBean 的
afterPropertiesSet()
关键注意事项
- 空指针检查:调用前验证回调对象非空
if (callback != null) callback.onProgress(percent);
- 生命周期管理:避免持有已销毁对象的引用(如Android的Activity泄露)
- 异步线程:在UI线程更新界面需切回主线程(Android用
runOnUiThread
) - 默认实现:使用适配器类提供空实现
public abstract class DownloadCallbackAdapter implements DownloadCallback { @Override public void onProgress(int percent) {} // 默认空方法 }
进阶用法
函数式接口(Java 8+)
@FunctionalInterface public interface SimpleCallback { void execute(); // 单一方法可使用Lambda } // 调用示例 SimpleCallback callback = () -> System.out.println("操作完成"); callback.execute();
多回调组合
public class PaymentService { private List<PaymentCallback> callbacks = new ArrayList<>(); public void addCallback(PaymentCallback callback) { callbacks.add(callback); } private void notifySuccess(String id) { for (PaymentCallback cb : callbacks) cb.onSuccess(id); } }
回调接口通过规范定义 → 实现注入 → 事件触发的流程,实现了模块间松耦合通信,重点在于:
- 接口设计明确职责
- 调用方与实现方解耦
- 异步场景注意线程安全
- 结合Lambda简化代码
这种模式在Java标准库中广泛应用,如Runnable
、Comparator
,是构建可扩展系统的基石。
引用说明:本文代码示例遵循Oracle官方Java编码规范,设计模式参考自《Effective Java》和《Head First Design Patterns》,异步线程处理建议参考Java Concurrency API文档。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/33083.html