Java中如何将两个相似重试方法合并为通用doRetry泛型方法
Java实现通用重试泛型方法的方案
核心思路
利用Java 8+提供的函数式接口封装可变的业务方法,将固定的重试逻辑抽为通用泛型方法,适配不同的业务函数调用。
你提到的func1和func2符合双入参、同返回值的特征,直接使用JDK自带的BiFunction<T, U, R>函数式接口即可承载。
具体实现
1. 定义通用泛型doRetry方法
/** * 通用重试方法 * @param targetFunc 要执行的目标业务函数 * @param param1 目标函数第一个入参 * @param param2 目标函数第二个入参 * @param retries 重试次数 * @param defaultValue 默认返回值 * @return 目标函数执行结果 * @param <T> 目标函数第一个入参类型 * @param <U> 目标函数第二个入参类型 * @param <R> 目标函数返回值类型 */ private <T, U, R> R doRetry(BiFunction<T, U, R> targetFunc, T param1, U param2, int retries, R defaultValue) { R result = defaultValue; for (int attempt = 0; attempt < retries; attempt++) { result = targetFunc.apply(param1, param2); // 可按需补充业务成功判定,符合预期直接返回,无需走完所有重试 // 示例:if (result != null || 其他业务判断条件) return result; } return result; }
2. 改造原有方法
原来的doRetryA和doRetryB直接调用通用方法即可,无需重复编写重试逻辑:
// 替换原有doRetryA private SomeType doRetryA() { return doRetry(this::func1, a, b, retries, someEnum.enumValue); } // 替换原有doRetryB private SomeType doRetryB() { return doRetry(this::func2, a, b, retries, someEnum.enumValue); }
扩展说明
- 如果你的业务函数参数个数不为2,可以选择对应函数式接口:0个入参用
Supplier<R>,1个入参用Function<T,R>,3个及以上入参可以自定义函数式接口,示例:
@FunctionalInterface public interface TriFunction<T, U, V, R> { R apply(T t, U u, V v); }
- 如果需要异常触发重试,可在
doRetry的循环内补充try-catch逻辑,捕获指定异常后继续重试即可。 - 你原贴的示例代码存在语法问题:Java无
def关键字、循环没有闭合大括号,实际使用时注意修正即可。
内容的提问来源于stack exchange,提问作者Dariusz Krynicki
相关产品推荐
相关产品推荐

