精选枚举代替开关

问题及其解决方案

开关/案例是用大多数命令式编程语言实现的通用控制结构。 开关比一系列的if / else更具可读性。

这是一个简单的示例:

// Switch with int literal
switch (c) {case 1: one(); break;case 2: two(); break;case 3: three(); break;default: throw new UnsupportedOperationException(String.format("Operation %d is not supported", c));
}

这是此代码中的主要问题的列表:

  1. int文字(1、2、3)与执行的代码之间的关系并不明显。
  2. 如果不再支持其中一个值(例如2),并且此开关未相应更新,它将永远包含未使用的代码。
  3. 如果引入了c的新可能值(例如4),并且未相应更新开关,则代码可能会在运行时抛出UnsupportedOperationException而没有任何编译时通知。
  4. 这种开关结构倾向于在代码中重复几次,从而使问题2和3更加复杂。

最简单的解决方法是使用int常量而不是文字。 首先,让我们定义常量:

private static int ONE = 1;
private static int TWO = 2;
private static int THREE = 3;

现在,代码将如下所示:

switch (c) {case ONE: one(); break;case TWO: two(); break;case THREE: three(); break;default: throw new UnsupportedOperationException(String.format("Operation %d is not supported", c));
}

(显然,在现实生活中,常量的名称必须是自描述的)

此代码段更具可读性,但所有其他缺点仍然相关。 改进初始代码段的下一个尝试使用2004年在版本5中引入Java语言的enums 。让我们定义以下enum

enum Action {ONE, TWO, THREE}

现在,开关片段将稍作更改:

Action a = ...
switch (a) {case ONE: one(); break;case TWO: two(); break;case THREE: three(); break;default: throw new UnsupportedOperationException(String.format("Operation %s is not supported", a));
}

这段代码要好一点:如果从enum Action删除其中一个元素,它将产生编译错误。 但是,如果将其他元素添加到enum Action ,则不会导致编译错误。 在这种情况下,某些IDE或静态代码分析工具可能会产生警告,但是谁在注意警告呢? 幸运的是, enum可以声明必须由每个元素实现的抽象方法:

enum Action {ONE { @Override public void action() { } }, TWO { @Override public void action() { } }, THREE { @Override public void action() { } }, public abstract void action();
}

现在,switch语句可以用单行替换:

Action a = ...
a.action();

此解决方案没有上面列举的任何缺点:

  1. 这是可读的。 该方法“附加”到enum元素。 如果方法含义不清楚,则可以编写所需数量的javadoc 。 调用方法的代码很简单:什么比方法调用更简单?
  2. 在不删除实现的情况下无法删除enum常量,因此,如果某些功能不再相关,则不会保留任何未使用的代码。
  3. 如果没有实现action()方法,则无法添加新的enum元素。 没有实现的代码无法编译。
  4. 如果需要执行多个操作,则可以在枚举中全部执行。 正如我们已经提到的,调用特定功能的代码是微不足道的,因此现在没有代码重复了。

结论

尽管开关/外壳结构是众所周知的,并且以各种编程语言广泛使用,但是其使用可能会引起很多问题。 上面描述的使用Java枚举的解决方案没有这些缺点。 本系列的下一篇文章展示了如何扩展现有enum功能。

翻译自: https://www.javacodegeeks.com/2019/03/featured-enum-instead-switch.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】国家开放大学2019年春季 2732土地利用规划 参考试题

试卷代号:2732 土地利用规划 试题 2019年7月 一、单选题(每小题3分.10小题,共30分) 1.降水量的单位为( )。 A.cm B.mm C.m D.ha 2.按照八大类土地…

物联网控制系统

物联网的发展和使用是跨时代的改变,在当今我们这个科技高速发展的时代,智能控制就是改善我们生活水平的主要方式。 随着物联网概念的深入,从智能路灯、智能家居到智慧农业、工业互联网,物联网不断的渗透到了各行各业当中&#xff…

linux基本指令chmod,Linux 常用命令

原标题:Linux 常用命令小编注:此篇文章来自#原创新人#活动,成功参与活动将获得额外100金币奖励此链接!自己开始接触 Linux「Ubuntu」应该是在大学期间, 接触 Unix「Mac OSX」是在工作后的第一份工作,吭哧吭…

POE供电的安全传输距离,网线的选择有哪些建议

POE供电的安全传输距离100米,建议使用超五类全铜网线。用标准以太网线缆传输直流电是可以传输很远的,那为什么传输距离会被限制在100米呢?接下来我们就跟随飞畅科技的小编一起来详细了解下POE供电的安全传输距离。 事实是POE交换机最大传输距…

zigbee是什么,为什么说它最适合智能家居设备

Zigbee是什么? 如果您的家里面有使用一款智能家居技术,那么这款技术就很有可能就是用的zigbee协议。Zigbee是一种无线通信协议,是基于IEEE820.15.4标准的低功耗局域网协议。是根据国际标准规定的,zigbee技术是一种短距离、低功耗的无线通信技…

java开发人员_Java 8:开发人员怎么看?

java开发人员由于Java 8发行倒计时已经开始,因此Java开发人员似乎肯定已经准备好参与其中。 根据Typesafe的一项调查 ,参与其中的开发人员中有65%回答说他们将在24个月的计划中迁移到Java 8,而从中有30%的开发者将在接…

lora模块在牛联网和智慧农业中的应用案列

LoRa为代表的低功率广域网(LPWAN)在全球范围中都得到了广泛的使用,由于它是一种开放式的通信标准,因此不仅是农场的专用网络到农业机械和农产平的状态监测等,都可以使用LoRa系列的产品。 牛联网 物联网不仅仅可以连接物…

工业交换机防护等级介绍

工业交换机防护等级,IP(INGRESS PROTECTION,进入防护)防护等级系统是由IEC(INTERNATIONAL ELECTROTECHNICAL COMMISSION,国际电工协会)所起草。将电器依其防尘防湿气之特性加以分级。这里所指的外物含工具,人的手指等均不可接触到…

休眠多对多教程

介绍: 在本教程中,我们将学习使用Hibernate ManyToMany注释定义和使用多对多实体关联。 上下文构建: 为了继续学习本教程,我们假设我们有两个实体- 雇员和资格: 众所周知,一名雇员可以拥有多个资格。 此外…

深度区分LoRa和LoRaWAN的区别

1.总体介绍 随着物联网技术的飞速发展,NB-IoT、LoRa、SigFox等通信技术名词我们也偶尔有所闻,对于普通人或者是刚刚接触物联网领域的人来说,在一大堆名词前面可能也是分布清楚,本文也将针对LoRa和LoRaWN做详细的介绍和比较。 总体…

工业交换机为何要老化测试

老化测试检测标准可以根据客户指定,无特殊要求即根据国家相应标准进行老化测试检验。老化测试主要是模拟产品在现实使用过程中的各种恶劣条件的高强度测试,同时根据使用的要求,合理地预测产品使用寿命。接下来飞畅科技的小编来为大家详细介绍…

物联网技术lora的简介和应用

物联网的通信传输技术,有很多种常用的方案,除了LORA以外,还有NB-IoT、WIFI、蓝牙、Zigbee、Dustl和sub-1GHz等,不同的通讯技术也有着不同的特点,和各自适合的应用场景。但是对于长距离。低功耗和小数据量的传输的应用场景&#xf…

cp ft wat_Java数组,Wat!

cp ft wat数组可以做一些令人惊讶的事情。 是否是数组? Serializable array new Serializable[9];数组是数组还是标量? 好吧,它是指向数组的标量。 就像 Object o new Object[9];您可以将数组分配给对象,因为它也是对象。 但是…

经典蓝牙和低功耗蓝牙(BLE)有什么区别?

蓝牙模块Bluetooth module)是指集成蓝牙功能的芯片基本电路集合,用于短距离2.4G的无线通讯模块。对于最终用户来说,蓝牙模块是半成品,通过在模块的基础上功能再开发、封装外壳等工序,实现能够利用蓝牙通讯的最终产品。…

工业交换机为什么需要进行高低温检测?

工业交换机采用宽温设计,-40℃~75℃的工作温度,是可以在极端条件下使用的工业级设备,每台工业交换机出厂都需要经过层层检测,接下来飞畅科技的小编就来为大家详细介绍下工业交换机为什么需要进行高低温的检测&#xff…

智能家居常用的十大应用场景

一、智能门锁:门锁为家庭安防第1条线,我们在享受智能化生活的同时,也同样要使家庭安全层次更上一层楼,所以我们的门锁具备联网功能,只要门锁被打开,信息就会同步到所有的手机客户端,什么是安全&…

Java 12常规可用性

马克雷因霍尔德(Mark Reinhold) 今天宣布 :“ Java 12的参考实现JDK 12现在可以普遍使用。” Reinhold在该公告中指出,“可以从https://jdk.java.net/12获得来自Oracle的GPL许可的OpenJDK构建,并且“无疑将很快提供来自…

工业现场为何必须使用工业环网交换机?

我们都知道,交换机有商业级和工业级的区分,商业级交换机一般使用在家庭、小型企业等场所,工业级交换机常常使用在工业环境中。那么,为什么工业环境中不能使用商业级交换机呢?工业现场为何必须使用工业环网交换机&#…

工业物联网简析

工业物联网是指在工业中应用物联网技术,让工业行业实现增值的技术模式。 所有的物联网都是为了实现万物互联,特别是物与物之间的互联,但是工业物联网又有其专有的属性,原因是与工业物联网相对的消费物联网本身的联网密度、联网的实…

formlayout_精简SWT FormLayout的用法

formlayout一直在追求效率,最近我重新考虑了SWT FormLayout的可用性。 尽管就灵活性而言,它是我最喜欢的核心布局之一,但我不得不认识到,大多数同仁都不愿意使用它。 考虑到面部React,建议将其建议用于适当的任务有时实…