
本文介绍使用泛型 + Supplier 封装可变逻辑,将多组结构相似但参数类型、返回类型和具体调用方法不同的方法统一为一个可复用的泛型辅助方法,显著减少样板代码。
本文介绍使用泛型 + `supplier
在 Java 开发中,当多个方法具有相同执行流程(如初始化原子引用、执行核心逻辑、处理中间状态、返回结果),仅在入参类型、返回类型及被调用的具体方法上存在差异时,硬编码会导致大量重复(boilerplate)——例如反复创建 AtomicReference、调用 set() 和 get()。这种模式正是泛型与函数式接口协同优化的理想场景。
推荐方案是定义一个泛型辅助方法,接收 java.util.function.Supplier
private <t> T helper(Supplier<t> method) {
AtomicReference<t> res = new AtomicReference();
res.set(method.get()); // 延迟执行实际业务逻辑
// 此处可插入通用处理:日志、异常包装、空值校验、缓存更新等
return res.get();
}</t></t></t>
该方法完全解耦了“执行流程”与“具体行为”:Supplier
使用示例:
private int f1(int t) {
return helper(() -> someMethod1(t)); // 推断 T = Integer
}
private int f2(String text) {
return helper(() -> someMethod2(text)); // 推断 T = Integer
}
private float f3(float x, float y) {
return helper(() -> someMethod3(x, y)); // 推断 T = Float
}
private float f4() {
return helper(() -> someMethod4()); // 推断 T = Float
}
✅ 优势总结:
- 零反射、零运行时开销:纯编译期泛型 + Lambda,性能等同手写;
- 类型安全:编译器全程校验 T 的一致性,避免 ClassCastException;
- 高度可扩展:后续新增类似方法(如 f5(List> data))只需一行调用;
- 逻辑集中维护:所有公共处理(如超时监控、指标埋点)只需修改 helper 内部,一处生效。
⚠️ 注意事项:
- 若原方法需抛出受检异常(checked exception),Supplier 不支持,此时应改用自定义函数式接口(如 ThrowingSupplier
)并配合 try-catch 包装; - AtomicReference 在此例中主要用于示意“可变容器”,若无并发需求或中间状态处理,可直接 return method.get() 进一步简化;
- 避免在 Supplier 中捕获并吞掉异常——应让异常自然抛出,由调用方或全局异常处理器统一处理。
通过这一设计,10 个相似方法可压缩为 1 个泛型入口 + 10 行声明式调用,代码更简洁、健壮且易于演进。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











