Java教程

Java面试题~基于注解+Enum+策略模式优化switch case

本文主要是介绍Java面试题~基于注解+Enum+策略模式优化switch case,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

摘要:本文我们将继续分享介绍第二道关于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

这篇关于Java面试题~基于注解+Enum+策略模式优化switch case的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!