【问题标题】:How to avoid multiple Switch case statements如何避免多个 Switch case 语句
【发布时间】:2020-11-05 06:07:44
【问题描述】:

我需要根据收到的 queryString 值重构使用多个 case 语句的代码。每次添加新查询时,我们都必须添加新的 case 语句。我们是否可以尝试简化它并使其更通用,以便我们不必继续添加新的案例陈述?下面是代码sn-p

      switch (queryRequestRecevied) {
        case query1:
            reply = processQuery1();
            break;

        case query2:
            reply = processQuery2();
            break;

        case query3:
            reply = processQuery3();
            break;

        case query4:
            reply = processQuery4();
            break;

        case query5:
            reply = processQuery5();
            break;

        case query6:
            reply = processQuery6();
            break;

        default:
            reply = processInvalidQuery();
            break;
      }

【问题讨论】:

    标签: java spring java-8 switch-statement


    【解决方案1】:

    您要查找的操作的名称是Replace Conditional with Polymorphism:不要使用switchif 语句,而是为您的案例使用一个通用接口并调用它。我在这里假设您的查询返回一些值并使用Supplier;如果没有,请使用其他功能接口或创建您自己的接口。

    Map<String, Supplier<QueryResult>> queryProcessors = new HashMap<>();
    
    ...
    // in a constructor or similar place
    queryProcessors.put(query1, this::processQuery1);
    queryProcessors.put(query2, this::processQuery2);
    
    // in your handler method
    var result = queryProcessors.getOrDefault(query, this::processInvalidQuery).get();
    

    要进一步解耦,您可以这样做:

    // declare some Spring beans implementing this interface
    interface QueryProcessor {
      String getQuery();
      QueryResult processQuery();
    }
    
    // in your service class
    Map<String, QueryProcessor> queryProcessors;
    
    @Autowired //(not necessary for a single constructor)
    MyService(Collection<QueryProcessor> queryProcessors) {
      this.queryProcessors = queryProcessors.stream()
        .collect(toMap(QueryProcessor::getQuery, identity()));
    }
    

    【讨论】:

      【解决方案2】:

      您没有提供足够的代码来查看可以分解/更通用的代码。

      但至少您可以在 @Controller 中为每个查询声明 1 个端点,而不是测试您的输入查询,然后无需切换 / 案例测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多