You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用switch语句根据参数值选择对应调用方法

问题

我编写了多个用于执行校验逻辑的类:其中一个类负责字符串校验,一个类负责数值校验,另外有一个控制器类根据参数值选择要调用的校验实现,相关代码如下:

public class SomeControllerClass {


    public SomeControllerClass() {
        String test = "Numeric";

        switch (test) {
            case "Numeric":
                System.out.println("CALL THE NUMERIC VALIDATION CLASS");
                break;
            case "String":
                System.out.println("CALL THE String VALIDATION CLASS");
                break;
        }

    }


}


public class StringValidation {
//methods = String validation (Max length etc)
}


public class NumericValidation {
//methods = Is numeric, range etc 
}

是否存在更优的实现方式,可以在不使用switch语句的前提下完成上述逻辑?

最佳实现方案

这种多分支选择同类逻辑的场景,完全可以通过策略模式+简单工厂+映射注册表的方案去掉硬编码的switch语句,同时满足开闭原则,后续扩展校验类型不需要修改原有控制器代码。

实现步骤

  • 定义统一的校验器接口
    所有校验逻辑类实现同一个公共接口,约束统一的调用入口:
    public interface Validator {
        // 可根据实际业务调整入参,比如传入待校验对象、校验规则配置等
        void validate(Object target);
    }
    
  • 改造原有校验类实现统一接口
    public class StringValidation implements Validator {
        @Override
        public void validate(Object target) {
            // 原有字符串校验逻辑:最大长度、格式校验等
            System.out.println("CALL THE String VALIDATION CLASS");
        }
    }
    
    public class NumericValidation implements Validator {
        @Override
        public void validate(Object target) {
            // 原有数值校验逻辑:数值格式、取值范围校验等
            System.out.println("CALL THE NUMERIC VALIDATION CLASS");
        }
    }
    
  • 构建校验器工厂与注册表
    用Map存储「校验类型标识-校验器实例」的映射关系,替代switch的分支判断逻辑:
    import java.util.HashMap;
    import java.util.Map;
    
    public class ValidatorFactory {
        private static final Map<String, Validator> VALIDATOR_REGISTRY = new HashMap<>();
    
        // 初始化时注册所有校验器
        static {
            VALIDATOR_REGISTRY.put("String", new StringValidation());
            VALIDATOR_REGISTRY.put("Numeric", new NumericValidation());
        }
    
        public static Validator getValidator(String validationType) {
            Validator validator = VALIDATOR_REGISTRY.get(validationType);
            if (validator == null) {
                throw new IllegalArgumentException("不支持的校验类型:" + validationType);
            }
            return validator;
        }
    }
    
  • 简化控制器逻辑
    替换原有switch代码,直接通过工厂获取对应校验器执行即可:
    public class SomeControllerClass {
        public SomeControllerClass() {
            String test = "Numeric";
            Validator validator = ValidatorFactory.getValidator(test);
            validator.validate(null);
        }
    }
    

方案优势

相比硬编码switch的实现,该方案扩展性更强:后续新增日期校验、集合校验等新的校验类型时,只需要新增实现Validator接口的类,在ValidatorFactory中注册对应的类型映射即可,不需要修改控制器的原有逻辑,大幅降低改旧代码引入bug的风险。
如果项目使用Spring等依赖注入框架,还可以进一步简化注册逻辑:框架会自动将所有Validator接口的实现类注入到Map中,无需手动编写静态块注册的代码。


内容的提问来源于stack exchange,提问作者Talktomegoose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:15:59