注解代替枚举_精选枚举代替开关

注解代替枚举

问题及其解决方案

开关/案例是用大多数命令式编程语言实现的通用控制结构。 开关比一系列的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/332670.shtml

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

相关文章

oracle表是动态表怎么算排名,Oracle学习动态性能表

按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。 类似于v$sOracle 学习动态性能表 v$locked_object本视图列出系统上的每个事务处理所获得的所有锁。V$LOCKED_OBJECT中的列说明:XIDUSN…

IntelliJ IDEA for Mac 中 Java Web Project 默认的工件(Artifacts)输出目录

你创建 Java Web 项目/模块时,IDEA 会自动创建 Web 模块的工件列表,而工件的默认输出目录如下: war 工件的默认输出目录: /Users/liaowenxiong/Documents/IdeaProjects/java-exercises/模块名称/target exploded 工件的默认输出…

oracle导数的数据乱码,Oracle10g导数据时中文乱码相关处理

1.Oracle导入数据库出现数据库数据中文乱码问题,最后查得是由于数据库安装时,选择编码为默认编码问题分析:使用imp导入数据时,屏幕输出过以下提提示信息:import done in US7ASCII character set and AL16UTF16 NCHAR c…

jdk12 jdk1.8_JDK 12的Files.mismatch方法

jdk12 jdk1.8JDK 12向Files类引入了一种新方法。 方法Files.mismatch(Path,Path)已通过JDK-8202302引入JDK 12,并在JDK 12 Early Access Build 20 (支持新{systemProperty} Javadoc标记的相同早期访问版本)中可用 。 JDK-8202302 [“用于比较…

tomcat如何查找请求资源的?

用户的请求过来,comcat 会根据虚拟目录先到 webapps 目录查找项目,如果找到了则进入到项目下的 WEB-INF 目录下查找 web.xml 文件,查找到则解析该文件,根据资源路径查找请求资源,如果找到了资源则正常实例化和调用有关…

java使用迭代器删除元素_使用Java从地图中删除元素

java使用迭代器删除元素关于从Java中的Map删除元素的非常简短的文章。 我们将专注于删除多个元素&#xff0c;而忽略了您可以使用Map.remove删除单个元素的Map.remove 。 以下Map将用于此帖子&#xff1a; Map<Integer, String> map new HashMap<>(); map.put(1…

IntelliJ IDEA普通的Java项目如何转成Maven Web项目

文章目录一、把项目改成 Java Web 项目二、把 Java Web 项目改成 Maven 项目三、调整目录结构四、部署项目五、参考一、把项目改成 Java Web 项目 注&#xff1a;只有 Web 项目才能创建 Artifact。 二、把 Java Web 项目改成 Maven 项目 得到的目录结构如下图所示&#xff1a;…

php全选按钮怎么写,PHP中的“全选”复选框,其中包含header.php

我必须在我的代码中包含一个header.php&#xff0c;那是问题的方面。当我不包括它&#xff0c;代码工作正常。但是&#xff0c;当我包含它代码不起作用&#xff0c;意味着检查所有按钮不会选中所有复选框。我的代码 -checkall.phpfunction toggle(source) {checkboxes documen…

bom .dom_MicroProfile 2.2 BOM导入支持

bom .domMicroProfile 2.2刚刚发布&#xff0c;其中包含对Fault Tolerance&#xff0c;Open Tracing&#xff0c;Open API和Rest Client API的更新。 自2.2版以来&#xff0c;还支持使用BOM&#xff08;物料清单&#xff09;依赖项导入。 通过这种方法&#xff0c;我们可以在d…

java: 错误: 不支持发行版本 5

文章目录一、在 pom.xml 文件中加入 properties 标签二、在 maven 的配置文件设置默认的 JDK 版本三、IDE 配置参考一、在 pom.xml 文件中加入 properties 标签 我本地安装的 JDK 版本是 11&#xff0c;配置如下&#xff1a; <properties><maven.compiler.source>…

谷歌gcp 远程计算机_引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream

谷歌gcp 远程计算机我最近在Sprint Central的工程博客上阅读了Josh Long的Bootiful GCP系列 &#xff0c;特别喜欢关于使用Google Cloud的Pub / Sub的第四部分 。 我感到受到该系列的启发&#xff0c;同时我还在为我的一个新项目评估Spring Cloud Stream。 我以为&#xff0c;我…

Oracle函数初探

我非常高兴有机会通过Cloud Native Limited Availability Program测试Oracle功能。 去年&#xff0c;当我上次尝试在Oracle Groundbreaker APAC巡回赛中在Oracle Cloud中运行无服务器功能时&#xff0c;有两种选择。 可以在虚拟机中运行我自己的Fn服务器&#xff0c;也可以在托…

在同一个tomcat中,使用不同的端口部署不同的项目

文章目录借助开发工具手动配置&#xff08;不使用开发工具&#xff09;第一步&#xff1a;修改 server.xml 文件第二步&#xff1a;创建部署目录第三步&#xff1a;复制 Catalina 目录第四步&#xff1a;复制 policy 和 properties 文件第五步&#xff1a;部署项目第六步&#…

jdk11换jdk8版本_在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流

jdk11换jdk8版本在JDK 8中&#xff0c;我们终于可以使用流了&#xff0c;除了您使用的API无法产生流的时代之外&#xff0c;其他一切都很好。 然后&#xff0c;您最终编写了一个包装器类方法&#xff0c;该方法允许您将迭代器转换为Stream&#xff0c;因为您错过了流。 public…

IntelliJ IDEA 的 Project Structure 窗口中的 Artifacts 勾选 Include in project build

文章目录在 war 工件勾选 Include in project buildBuild Project/ModuleRebuild Project/Module在 war exploded 工件勾选 Include in project build在 war 工件勾选 Include in project build war 工件处勾选 Include in project build&#xff0c;表示在构建项目/模块之后&a…

华为linux系统能用Cad么,华为平板能装cad画图吗 华为平板可以用cad软件吗?

华为平板可以用cad软件吗&#xff1f;华为平板是可以安装cad画图软件的&#xff0c;不管是什么设备&#xff0c;关键是操作系统符合下面的要求&#xff0c;就可以安装&#xff1a; 1、微软的window 系列操作系统 2、苹果的电脑操作系统 3、Linux系统华为mate平板可以安装CAD画图…

java客户端api文档_Java 11:新的HTTP客户端API

java客户端api文档在Java 11中&#xff0c;已将最初在Java 9中引入的孵化HTTP客户端API进行了标准化。 它使连接URL&#xff0c;管理请求参数&#xff0c;cookie和会话更加容易&#xff0c;甚至支持异步请求和websocket。 概括地说&#xff0c;这是使用传统的URLConnection方法…

linux date字符串日期格式,Linux中date用法

1、命令&#xff1a;date2、命令功能&#xff1a;date 可以用来显示或设定系统的日期与时间。3、命令参数-d&#xff1a;显示字符串所指的日期与时间。字符串前后必须加上双引号&#xff1b;-s&#xff1a;根据字符串来设置日期与时间。字符串前后必须加上双引号&#xff1b;-u…

jar/war/ear文件的区别

参阅&#xff1a; https://www.cnblogs.com/perfy/p/3597852.html https://blog.csdn.net/weixin_29022299/article/details/114063154 https://www.cnblogs.com/uriel/p/4874383.html https://www.cnblogs.com/sagech/p/4907163.html https://www.cnblogs.com/nizuimeiabc1/p/…

vim 命令模式 筛选_10个步骤的筛选器模式

vim 命令模式 筛选过滤器是仅在某些情况下应应用的模式。 在原始帖子中 &#xff0c;我提供了一个非常简单的示例&#xff0c;旨在演示如何应用它。 在这篇文章中&#xff0c;我提供了一个更详细的示例&#xff0c;该示例还旨在说明何时以及为什么应用它。 介绍 该职位包括以…