摘要:本文我们将继续分享介绍第二道关于Java面试的“代码优化题”,主要实现的功能为:基于Spring Boot采用“注解+Enum枚举+策略模式”的思想优化项目中频繁需要增减if else的判断或者switch case中常量的取值。
内容:最近看到某位正在求职Java后端开发的小伙伴留言给debug发了这么一道面试题,并咨询相应的解决方案:“在一个正规的企业级项目中,或多或少会存在着if else、if else判断的代码,倘若判断的层级只是2/3层,倒还说得过去,但倘若层级数超过了7/8层,甚至还有的超过了10层(捂脸),那对于后来的维护者而言或许会是一场灾难,而且,如果需要增加、删减某一层级的判断,那难免需要去动那段 具有10几层级数 的if else,如果恰巧这段代码的改动很有可能会影响C端、即用户端的使用,那将是很糟糕的”
(附注:以上这种情况跟switch case代码块堆积体现出来的效果是一样的)!
下面,直接看这段代码吧(talk is sheap,show me the code 还是代码比较实在,说太多都是废话):
public class SwitchCaseExecute {
public static CaseResponse execute(CaseRequest request){
CaseResponse response;
switch (request.getType()){
case "A":
response= methodA(request);
break;
case "B":
response= methodB(request);
break;
//………
default:
response= methodC(request);
break;
}
return response;
}
public static CaseResponse methodA(CaseRequest request){
CaseResponse response=new CaseResponse();
response.setResult("A"+request.getName());
return response;
}
public static CaseResponse methodB(CaseRequest request){
CaseResponse response=new CaseResponse();
response.setResult("B"+request.getName());
return response;
}
public static CaseResponse methodC(CaseRequest request){
CaseResponse response=new CaseResponse();
response.setResult("C"+request.getName());
return response;
}
public static void main(String[] args) {
CaseRequest request=new CaseRequest("A","这是名字");
System.out.println(execute(request));
}
}
从上面这段代码中可以看出,如果现在需要增加常量值C、D、E、F….以及每个常量值对应的“方法操作逻辑”,那么毫无疑问,需要在execute()方法中新增许许多多的case以及对应的“方法操作逻辑”!
很显然,这种方式虽然可以实现功能,但是从“面向对象思想”以及“代码简洁度”的角度来看,这显然是有点冗余以及“面向过程思想”!
下面,我们从 注解+Enum+策略模式 的角度来优化这段冗余的代码,我们期望达到的效果是:可以只用一个注解的形式来实现动态增减上面那些case对应的常量值及其对应的“方法操作逻辑”,其完整的过程如下所示:
(1)首先,我们需要定义一个包含上述case常量值的枚举类CaseEnum,其源代码如下所示:
public enum CaseEnum {
A("A"),
B("B"),
C("C"),
;
private String type;
CaseEnum(String type) {
this.type = type;
}
//省略type的getter setter方法
}
(2)紧接着,我们定义注解CaseAnnotation,这个注解将用于“方法操作逻辑实现类”之上,其源代码如下所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CaseAnnotation {
CaseEnum value();
}