如何避免多个 Switch case 语句
How to avoid multiple Switch case statements
我需要根据收到的 queryString 值重构使用多个 case 语句的代码。每次添加新查询时,我们都必须添加一个新的 case 语句。我们能否尝试简化它并使其更通用,这样我们就不必继续添加新的 case 语句?下面是代码片段
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;
}
您没有提供足够的代码来查看可以分解/更通用的内容。
但至少您可以在@Controller 中为每个查询声明 1 个端点,而不是测试您的输入查询,然后无需切换/案例测试。
您要查找的操作的名称是 用多态性替换条件:不要使用 switch
或 if
语句,而是使用通用的为您的案例提供接口并调用它。我在这里假设您的查询 returns 一些值并使用 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()));
}
我需要根据收到的 queryString 值重构使用多个 case 语句的代码。每次添加新查询时,我们都必须添加一个新的 case 语句。我们能否尝试简化它并使其更通用,这样我们就不必继续添加新的 case 语句?下面是代码片段
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;
}
您没有提供足够的代码来查看可以分解/更通用的内容。
但至少您可以在@Controller 中为每个查询声明 1 个端点,而不是测试您的输入查询,然后无需切换/案例测试。
您要查找的操作的名称是 用多态性替换条件:不要使用 switch
或 if
语句,而是使用通用的为您的案例提供接口并调用它。我在这里假设您的查询 returns 一些值并使用 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()));
}