
本文探讨了在java中如何重构具有相同业务逻辑但接受不同参数类型的多个方法。通过引入通用接口实现多态,或利用私有助手方法封装核心逻辑,可以有效消除代码冗余,提高代码的可维护性和可读性。文章将详细介绍这两种策略的实现方式及适用场景。
在软件开发中,我们经常会遇到这样的场景:多个方法执行着几乎相同的业务逻辑,但它们接受的输入参数类型却不尽相同。这种代码模式,虽然在功能上是正确的,但却引入了大量的代码重复,严重影响了代码的可维护性、可读性,并增加了未来修改时引入错误的风险。
考虑以下三个方法,它们都用于计算金额,但分别接受 QRequest、CState 和 RState 三种不同的请求对象:
public static String calculateAmount(QRequest qRequest) {
if (qRequest.getValue() == null) {
return "300_VALUE"; // 常量占位符
}
// ... 其他核心逻辑
if (qRequest.getValue().getOptionalCodes().contains(125)) {
return "125_VALUE";
} else if (qRequest.getValue().getOptionalCodes().contains(600)) {
return "600_VALUE";
} else {
return "300_VALUE";
}
}
public static String calculateAmount(CState cState) {
if (cState.getValue() == null) {
return "300_VALUE"; // 常量占位符
}
// ... 其他核心逻辑
if (cState.getValue().getOptionalCodes().contains(125)) {
return "125_VALUE";
} else if (cState.getValue().getOptionalCodes().contains(600)) {
return "600_VALUE";
} else {
return "300_VALUE";
}
}
public static String calculateAmount(RState rState) {
if (rState.getValue() == null) {
return "EXCESS_300_VALUE"; // 注意这里与前两者不同
}
// ... 其他核心逻辑
if (rState.getValue().getOptionalCodes().contains(125)) {
return "125_VALUE";
} else if (rState.getValue().getOptionalCodes().contains(600)) {
return "600_VALUE";
} else {
return "300_VALUE";
}
}可以看到,除了参数类型和 getValue() 返回的 Value 对象外,这些方法的内部逻辑几乎完全相同。这种重复是重构的理想目标。本文将介绍两种有效的重构策略来解决这个问题。
当多个不相关的类共享相同的行为或数据访问方式时,引入一个通用接口是实现代码复用的最佳实践。这种方法利用了面向对象编程的多态特性。
立即学习“Java免费学习笔记(深入)”;
定义接口: 创建一个接口,声明所有相关类都应具备的公共方法。在这个例子中,所有请求对象都提供一个 getValue() 方法来获取核心的 ValueType 对象。
import java.util.Set;
// 假设 ValueType 是一个具体的类,例如:
class ValueType {
private Set<Integer> optionalCodes;
// ... constructor and other methods
public Set<Integer> getOptionalCodes() {
return optionalCodes;
}
}
interface HasValue {
ValueType getValue();
}实现接口: 让所有需要统一处理的类实现这个新定义的接口。
class QRequest implements HasValue {
private ValueType value;
// ... constructor and other methods
@Override
public ValueType getValue() {
return value;
}
}
class CState implements HasValue {
private ValueType value;
// ... constructor and other methods
@Override
public ValueType getValue() {
return value;
}
}
class RState implements HasValue {
private ValueType value;
// ... constructor and other methods
@Override
public ValueType getValue() {
return value;
}
}重构核心方法: 将原有的多个方法合并为一个,使其接受新定义的接口类型作为参数。
// 假设 ServiceException 是自定义的异常类
class ServiceException extends RuntimeException {
public ServiceException(String message) {
super(message);
}
}
// 假设常量已定义
final class Constants {
public static final String DEFAULT_300_VALUE = "300_VALUE";
public static final String EXCESS_300_VALUE = "EXCESS_300_VALUE"; // RState 特有的默认值
public static final String VALUE_125 = "125_VALUE";
public static final String VALUE_600 = "600_VALUE";
public static final int CODE_125 = 125;
public static final int CODE_600 = 600;
}
public static String calculateAmount(HasValue hasValue) {
ValueType value = hasValue.getValue();
// 处理 RState 特有的默认值逻辑
if (value == null) {
if (hasValue instanceof RState) {
return Constants.EXCESS_300_VALUE;
} else {
return Constants.DEFAULT_300_VALUE;
}
}
Set<Integer> optionalCodes = value.getOptionalCodes();
if (optionalCodes.contains(Constants.CODE_125) && optionalCodes.contains(Constants.CODE_600)) {
throw new ServiceException("Multiple options received");
}
if (optionalCodes.contains(Constants.CODE_125)) {
return Constants.VALUE_125;
} else if (optionalCodes.contains(Constants.CODE_600))以上就是Java方法重构:通过接口或助手方法统一处理多参数类型逻辑的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号