2026年04月17日/ 浏览 6
正文:
在Java开发中,我们常遇到需要处理多种类型参数的方法。例如,一个数据解析器可能需要支持String、JSON或XML格式的输入。若直接为每种类型编写独立方法,会导致代码冗余且难以维护。如何优雅地统一处理?以下是一种结合策略模式与泛型的实践方案。
假设有一个数据校验工具,需处理以下参数类型:
java
public void validate(String text) { /*...*/ }
public void validate(JsonNode json) { /*...*/ }
public void validate(Element xml) { /*...*/ }
随着类型增加,方法会迅速膨胀,且校验逻辑可能重复。
1. 定义参数处理接口
通过泛型抽象统一行为:
public interface ParameterHandler<T> {
void handle(T param);
}
2. 实现具体策略
为每种类型编写处理类:
public class StringHandler implements ParameterHandler<String> {
@Override
public void handle(String text) {
// 校验字符串逻辑
}
}
public class JsonHandler implements ParameterHandler<JsonNode> {
@Override
public void handle(JsonNode json) {
// 解析JSON逻辑
}
}
3. 构建统一入口
利用Map存储类型与策略的映射,避免if-else链:
public class Validator {
private Map<Class<?>, ParameterHandler<?>> handlers = new HashMap<>();
public Validator() {
handlers.put(String.class, new StringHandler());
handlers.put(JsonNode.class, new JsonHandler());
// 注册其他处理器...
}
public <T> void validate(T param) {
ParameterHandler<T> handler = (ParameterHandler<T>) handlers.get(param.getClass());
if (handler != null) {
handler.handle(param);
} else {
throw new IllegalArgumentException("Unsupported parameter type");
}
}
}
Map查找比instanceof更高效,但需注意子类匹配问题(可结合Class.isAssignableFrom()优化)。 通过这种设计,代码既保持了单一职责原则,又实现了多类型参数的统一处理,让复杂逻辑变得清晰可维护。