文/朱季谦

想起刚开始接触JAVA编程的时候,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭。等到编程能力渐渐提升之后,再回过头去看曾经写过的满屏if-else时,脑海里只有一个画面,全都是翔。

那么,如何消除在项目里大量使用if-else呢?

网络上有很多解决思路,有工厂模式、策略模式、甚至是规则引擎(这个太重了吧)......

这些,都有一个共同的缺点,即使用起来还是过于繁重了。虽说避免出现过多的if-else,但是,却增加很多额外的类,我总觉得,很不实用,只能当做某种模式的学习即可。

真正在项目中能替换大量if-else语句,且具备较好的可读性与扩展性的,我比较推荐使用策略枚举来消除if-else。

假如有这样一个需求,实现一周七天内分别知道要做事情的备忘功能,那么,用if-else,可能是会这样实现——

 1 //if-else判断
2 public String getToDoByIfElse(String day){
3 if("Monday".equals(day)){
4 return "今天上英语课";
5 }else if("Tuesday".equals(day)){
6 return "今天上语文课";
7 }else if("Wednesday".equals(day)){
8 return "今天上数学课";
9 }else if("Thursday".equals(day)){
10 return "今天上音乐课";
11 }else if{
12 return "今天上编程课";
13 }else{
14 ......
15 }
16 }

若要改成策略枚举模式,可直接这样,首先,先定义一个调用方法,假如传进的是星期一,即参数"Monday",在下面方法里,通过DayEnum.valueOf("Monday")可获取其枚举属性,这里应该得到的是Monday——

//策略枚举判断,调用方法getToDoByEnum
public String getToDoByEnum(String day){
CheckDay checkDay=new CheckDay();
return checkDay.day(DayEnum.valueOf(day));
}

接下来,CheckDay()方法里会做一个策略匹配,根据上面传进来的DayEnum.valueOf("Monday"),即得到了枚举Monday,那么,在这个方法里,就会执行Monday.toDo()——

public class CheckDay {
public String day( DayEnum dayEnum) {
return dayEnum.toDo();
}
}

也就是执行Monday里的toDo(),该枚举属性当中实现了toDo()方法——

public enum DayEnum {
Monday {
@Override
public String toDo() {
return "今天上英语课";
}
},
Tuesday {
@Override
public String toDo() {
return "今天上语文课";
}
},
Wednesday {
@Override
public String toDo() {
return "今天上数学课";
}
},
Thursday {
@Override
public String toDo() {
return "今天上音乐课";
}
};
public abstract String toDo();
}

总结一下,策略枚举就是枚举当中使用了策略模式,所谓的策略模式,即给你一把钥匙,按照某种约定的方式,可以立马被指引找到可以打开的门。例如,我给你的钥匙叫“Monday”,那么,就可以通过约定方式dayEnum.toDo(),立马找到枚举里的Monday大门,然后进到门里,去做想做的事toDo(),其中,每扇门后的房间都有不同的功能,但它们都有一个相同抽象功能——toDo(),即各房间共同地方都是可以用来做一些事情的功能,但具体可以什么事情,就各有不同了。

这里,会出现一种情况,即,假如有多个重复共同样功能的判断话,例如,在if-else里,是这样——

public String getToDoByIfElse(String day){
if("Monday".equals(day)||"Tuesday".equals(day)||"Wednesday".equals(day)){
return "今天上英语课";
}else if("Thursday".equals(day)){
......
}
}

那么,在策略枚举下应该如何使用从而避免代码冗余呢?

可以参考一下以下思路,设置一个内部策略枚举,将有相同功能的外部引用指向同一个内部枚举属性,这样即可实现调用重复功能了——

public enum DayEnum {
//指向内部枚举的同一个属性即可执行相同重复功能
Monday("星期一", Type.ENGLISH),
Tuesday("星期二", Type.ENGLISH),
Wednesday("星期三", Type.ENGLISH), Thursday("星期四", Type.CHINESE);
private final Type type;
private final String day;
DayEnum(String day, Type type) {
this.day = day;
this.type = type;
}
String toDo() {
return type.toDo();
}
/**
* 内部策略枚举
*/
private enum Type {
ENGLISH {
@Override
public String toDo() {
return "今天上英语课";
}
},
CHINESE {
@Override
public String toDo() {
return "今天上语文课";
}
};
public abstract String toDo();
}
}

我很喜欢在大批量if-else里使用策略枚举来消除替换,总而言之,使用策略枚举可以很灵活处理各种复杂判断,且可读性与扩展性都比较好,它更像是函数式编程,而大批量if-else,则是面向过程了。因为,if-else是从上往下一个if接一个if判断下去的,在各个if上打个断点,debug下去,就明白了。

由此可知,若项目里有大量的if-else话,着实是一件很影响性能的事情。

策略枚举:消除在项目里大批量使用if-else的正确姿势的更多相关文章

  1. SAP MM 实施项目里Open PO 迁移思路探讨

    SAP MM 实施项目里Open PO 迁移思路探讨 .序言.   SAP项目上线前夕,除了静态主数据需要导入以外,可能还有一些动态数据,比如open的采购订单,open的销售订单等单据也要迁移到SA ...

  2. java常量类的实现方式_枚举类_项目实践

    前言 众所周知,系统里有很多比如订单状态.审核状态:性别.结算方式.交易类型等属性,这些属性只有几个值,一般用0.1.2.3等的数字标识存入数据库,每次对这些属性所属对象的增删改操作,都会在代码里给状 ...

  3. 如何把Spring制作成jar包,然后在项目里运行。

    第一步:首先我们先把Spring的代码准备好.如图一 (图1). 第二步:我们在桌面新建一个文件夹,如图二 (图2). 我们要在这个文件夹里新建两个夹,一个文件夹是你项目的包名,也就是我们图1的aop ...

  4. ANDROID STDUIO 项目里的R文件突然丢失的解决办法N种之一

    刚刚项目里的R文件突然挂了,清理项目,关闭重开Studio,都不能解决.快没折了. 然后只好在项目上右击,看看有没有解决的办法.发现有个 Make Module ,姑且试试吧. 结果,竟然修复了.这是 ...

  5. 在asp.net mvc4项目里bootstrap datetimepicker控件的使用

    前段时间写了一篇关于调用阿里大于的短信接口来开发例会短信群发通知功能的文章http://www.cnblogs.com/zhouyuangan/p/apicall_1.html,其中的例会时间是需求中 ...

  6. 在Android Studio和Android Eclipse 更改现有项目里的SDK版本

    一,在Eclipse下改项目里的SDK的版本方法有几种,都比较简单:1.右键单击项目--->properties---->Resource----->Android在Project ...

  7. 项目里的jquery.min.js错误

    项目里的jquery.min.js报一系列 - Missing semicolon - Missing semicolon - Missing semicolon - Missing semicolo ...

  8. [Cordova] 无法编译Visual Studio项目里Plugin副本的Native Code

    [Cordova] 无法编译Visual Studio项目里Plugin副本的Native Code 问题情景 开发Cordova Plugin的时候,开发的流程应该是: 建立Cordova Plug ...

  9. eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法

    eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法 当使用eclipse导入外部的web工程时,有时会提示HttpServletRequest, Serv ...

随机推荐

  1. Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢?

    参考出处: http://www.imooc.com/qadetail/76393 Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢? 背景介绍: 文件名  为英文时可以下载 ...

  2. GitHub new features 2020 All In One

    GitHub new features 2020 All In One Discussions Discussions is the space for your community to have ...

  3. Web API 设计

    Web API 设计 The Design of Web APIs free online ebook https://www.manning.com/books/the-design-of-web- ...

  4. WebVR & CSS 3D & WebGL

    WebVR & CSS 3D & WebGL VR https://developer.mozilla.org/en-US/docs/Web/API/WebVR_API https:/ ...

  5. Android Studio show whitespace & Android studio 设置注释缩进

    Android Studio show whitespace & Android studio 设置注释缩进 https://github.com/xgqfrms/flutter/issues ...

  6. Masterboxan INC发布《2019年可持续发展报告》

    近日,Masterboxan INC万事达资产管理有限公司(公司编号:20151264097)发布<2019年可持续发展报告>,全面回顾了在过去一年Masterboxan INC开展的可持 ...

  7. sql语句的练习,已练习的会以绿色标注!!!

    表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师 ...

  8. SpringBoot整合Mongodb4.0

    本品文章只做学习使用: 安装mongodb推荐博客:https://www.jianshu.com/p/a75e26e5f635 1:如何在外网环境下开放mongodb 服务器版本:centos7.6 ...

  9. Java基础语法:注释

    书写注释是一个非常好的习惯. 注释并不会被执行,是给我们写代码的人看的. Java中的注释有三种: 单行注释(Line comment) 多行注释(Block comment) 文档注释(JavaDo ...

  10. Linux系统编程【4】——文件系统

    pwd命令的作用 Linux的文件系统比较庞大,所以笔者从pwd这一命令入手,在实现的过程中加深对文件系统的了解. 输入:man pwd 从指导文档中可以看到,pwd命令的作用是显示出当前所处位置,以 ...