摘要:本文我们将继续分享介绍第二道关于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(); }
更多请见:http://www.mark-to-win.com/tutorial/51084.html