如何将三个同逻辑不同入参类型的calculateAmount方法重构为单一方法?
单一方法处理三种入参类型的可行方案
如果不想提取统一的Value对象,确实可以实现单一方法接受三种入参类型,核心思路是用Object作为参数,结合instanceof做类型判断,具体代码实现如下:
// 假设常量定义 public static final String EXCESS_300_VALUE = "EXCESS_300"; public static final String VALUE_300 = "300"; public static String calculateAmount(Object input) { // 处理RState类型的特殊逻辑 if (input instanceof RState) { RState rState = (RState) input; return rState.getValue() == null ? EXCESS_300_VALUE : VALUE_300; } // 处理QRequest和CState的通用逻辑 else if (input instanceof QRequest || input instanceof CState) { return VALUE_300; } // 非法类型抛出异常 else { throw new IllegalArgumentException("不支持的入参类型: " + input.getClass().getName()); } }
方案优缺点
- 优点:完全满足「单一方法」的需求,无需修改原有三个类的结构,快速实现逻辑统一。
- 缺点:
- 失去编译时类型检查,传入非指定类型的对象只能在运行时抛出异常;
- 依赖强制类型转换,代码类型安全性不足,后期修改类结构时容易出现遗漏。
补充说明
如果允许给三个类新增共同接口(比如HasValue,定义getValue()方法),可以用泛型+接口约束实现更优雅的单一方法,但这本质上属于「提取Value接口」的思路,不符合你不想这么做的前提,因此上面的Object+instanceof是最直接的方案。
内容的提问来源于stack exchange,提问作者runnerpaul
相关产品推荐
相关产品推荐

