jdk switch 枚举_JDK 12开关表达式遇到意外的枚举值

jdk switch 枚举

正如我在“ 玩JDK 12的Switch表达式 ”一文中所写的那样, JDK 12 Early Access Build使JEP 325 [“ Switch Expressions(Preview)”)实现的实验变得容易。 我的帖子“ JDK 12:实际中的切换语句/表达式 ”使用代码示例来演示增强的switch 语句和新的switch 表达式的核心特征。 在本文中,我将介绍在JEP 325中显式调用的一种特殊情况,该特殊情况与在运行时添加到switch表达式中的枚举有关。

因为switch 表达式返回一个值,所以必须通过case处理该switch可能遇到的所有可能case (或对于那些未与case明确关联的case default将其覆盖)。 JEP 325规定如下:

switch表达式的情况必须详尽无遗; 对于任何可能的值,必须有一个匹配的开关标签。 实际上,这通常仅意味着需要一个默认子句。 但是,在枚举开关表达式涵盖所有已知情况的情况下(最终,开关表达式通过密封类型),编译器可以插入默认子句,该子句指示枚举定义在编译时和运行时之间已更改。 (这是开发人员今天手动执行的操作,但是让编译器插入它比手动编写的代码更具侵入性,并且可能具有更具描述性的错误消息。)

我已经写了类似于JEP 325中描述的代码(“这就是开发人员今天要做的事情”),正如我在博客文章“ 记录意外的开关选项 ”中所讨论的那样。 过去,通常明智的做法是添加逻辑来处理或记录未在default显式调用或处理的switch语句选项。 随着通过JDK 12和JEP 325的switch表达式的出现,现在是必需的。

JEP 325解决了枚举上的switch 表达式的情况,并明确指定了如何支持在编译带有switch表达式的枚举和代码的casecase子句中显式指定了所有枚举值的case ,但后来又添加了更多的值到枚举,而无需使用该枚举重新编译switch表达式代码。

为了展示这种支持,我将展示一个简单的枚举以及两个基于JEP 325和JDK Early Access Build 10的示例,以便在switch 语句switch 表达式中使用该枚举。

下面的代码清单显示了一个简单的枚举,称为Response ,只有两个值。

package dustin.examples.jdk12.switchexp;/*** Enum representation of a response.*/
public enum Response
{YES,NO;
}

下一个代码清单显示了一个类,其中包含使用上述枚举的两个方法。 一种方法针对该枚举使用switch 语句 ,另一种方法针对该枚举使用switch 表达式

package dustin.examples.jdk12.switchexp;import static java.lang.System.out;/*** Demonstrates implicit handling of expanding enum* definition related to JEP 325 switch expressions and* switch statements.*/
public class GrowingEnumSwitchDemo
{public static void printResponseStringFromStatement(final Response response){out.println("Statement [" + response.name() + "]:");switch (response){case YES:out.println("Si!");break;case NO:out.println("No!");break;}}public static void printResponseStringFromExpression(final Response response){out.println("Expression [" + response.name() + "]:");out.println(switch (response){case YES -> "Si!";case NO -> "No!";});}public static void main(final String[] arguments){if (arguments.length < 1){out.println("Provide an appropriate 'dustin.examples.jdk12.switchexp.Response' string as an argument.");System.exit(-1);}final String responseString = arguments[0];out.println("Processing string '" + responseString + "'.");final Response response = Response.valueOf(responseString);printResponseStringFromStatement(response);printResponseStringFromExpression(response);}
}

上面的代码( 在GitHub上也可用 )将编译而不会发生意外,并且当我在GrowingEnumSwitchDemo类上执行main函数并将其传递给“ YES”字符串时,它将按预期工作。 如果我向Response枚举添加一个新值MAYBE仅编译该枚举Java文件 ,然后使用字符串“ MAYBE”运行GrowingEnumSwitchDemo.main(String[])GrowingEnumSwitchDemo.main(String[])遇到IncompatibleClassChangeError 。 接下来显示新的Response.java清单,然后是屏幕快照,该屏幕快照演示了仅用新值重新编译枚举并使用先前编译的调用代码运行后,刚刚描述的问题。

package dustin.examples.jdk12.switchexp;/*** Enum representation of a response.*/
public enum Response
{YES,NO,MAYBE;
}

开关表达

IncompatibleClassChangeError的存在使我们很明显地发现,枚举上有一个新值,该值以前没有由switch表达式处理。 这使开发人员可以通过添加枚举值的case或添加全包式default来修复switch表达式。 这可能会比今天的当前情况更好,在当前情况下,使用: / break语法的switch语句将在相同情况下无提示地继续运行(在先前的代码清单和屏幕快照中也得到了证明)。

关于通过JEP 325引入Java的增强功能,有几件令人喜欢的事情。“箭头”语法使switch 表达式switch 语句不必承受令人惊讶的范围问题,无意跌倒的风险或需要明确的break s的负担。 此外,必须返回值的switch 表达式可以与枚举结合使用,以确保所有枚举值始终在编译时进行处理(如果并非在编译时处理所有枚举值,则不会进行编译)如果使用的枚举添加了一个值并与先前编译的客户端代码一起使用,则会引发错误。

翻译自: https://www.javacodegeeks.com/2018/09/jdk-12-switch-expression-encountering-unanticipated-enum-value.html

jdk switch 枚举

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

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

相关文章

MacBook/MacOS如何写入MacBook特有的符号(例如:⌘/⌥/⎋/⇪)

文章目录步骤说明图文说明步骤说明 1.打开「表情与符号」 按快捷键 Ctrl Command Space 打开「表情与符号」窗口&#xff1b;你也可以在顶部菜单栏中的输入法&#xff0c;然后点击下拉的菜单列表中的「显示表情与符号」。如果找不到这个菜单项&#xff0c;你需要在电脑的「系…

java-jar jvm_使用Java流和In-JVM-Memory的超低延迟查询

java-jar jvm自然界的基本规则&#xff08;例如光速和通用信息论&#xff09;对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制。 了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级。 例如&#xff0c;如果应用程序服务器和数据库服务器相距…

关闭进程

查看端口是否被占用 netstat -ano|findstr “2181” 关闭进程 tskill port

iTerm2 for MacOS(终端模拟器/终端仿真器/命令终端工具)设置详解

文章目录General 通用Startup 启动Closing 关闭MagicSelectionWindowtmuxAppearanceGeneral隐藏程序图标theme 主题tab bar location 选项卡栏位置status bar location状态栏位置WindowsTabsPanesDimming 调光Profiles 配置文件General自定义终端界面的标志自定义标签页标题Sho…

dcdc芯片效率不高的原因_研学丨燃料电池车的典型效率及能耗

燃料电池的一大优势是高效率&#xff0c;能够更高效的利用能源。现在燃料电池车的研发已经持续了相当长一段时间(世界上第一辆燃料电池车为1966年通用的Electrovan)&#xff0c;燃料电池车也迭代了许多&#xff0c;那么燃料电池车的效率、氢耗水平都怎么样呢&#xff1f;这里通…

groovy lambda_Java Lambda流和Groovy Clouse的比较

groovy lambda这篇博客文章将研究List数据结构上的一些谚语操作&#xff0c;并对Java 8/9和Groovy语法进行一些比较。 因此&#xff0c;首先是数据结构。 这只是一个简单的橄榄球球员&#xff0c;具有名字和等级。 Java class RugbyPlayer {private String name;private Inte…

Maven定制化打包后的包名(加入时间戳)

在对应的pom文件中加入配置 设置时间戳格式 <properties> <maven.build.timestamp.format>yyyy-MM-dd_HH_mm</maven.build.timestamp.format> </properties> 定制包名字 <build> <finalName>${project.artifactId}-${project.versio…

MacOS/MacBook设置短语快捷键

打开电脑的系统偏好设置 → 键盘 → 文本&#xff0c;如下图所示&#xff1a;

mhd格式三维图像显示_给你的家乡做个三维地图模型,满满的成就感,快来学习下...

以上三维地图模型&#xff0c;利用卫星影像高程数据&#xff0c;实现地图立体三维效果&#xff0c;自己就可以在电脑上个3D沙盘&#xff0c;是不是很酷呢&#xff1f;想要制作三维地图模型必须两样素材&#xff0c;第一是卫星影像&#xff0c;第二是高程数据&#xff0c;之前的…

纹理和基元_Java的精妙之处,包括基元和变量参数数组

纹理和基元在我最近的博客文章Arrays.hashCode&#xff08;&#xff09;与 DZone联合版本的评论中提出了一个有趣的问题。 Objects.hash&#xff08;&#xff09; “。 该评论的作者建立了一些示例&#xff0c;这些示例与我的博客文章中使用的示例相似&#xff0c;并且显示出与…

ORACLE数据库常用命令总结

SELECT * FROM all_tables WHERE ownericore_prdtdb; --查询当前用户下所有的表名 SELECT table_name FROM user_tables; --查询当前用户下所有的表 SELECT * FROM user_tables; --查询当前用户下所有的索引 SELECT * FROM USER_indexes; --查询当前用户下所有的序列 SEL…

MacOS使用brew无法安装Python_无法安装gdbm_无法安装autojump

文章目录出现的问题解决无法安装gbdm的问题解决无法安装Python的问题GNU 程序国内下载源&#xff1a;https://mirrors.ustc.edu.cn/gnu/ brew 下载的软件安装包存放在下面的目录&#xff1a; liaowenxiongdeMacBook-Air:Homebrew liaowenxiong$ brew --cache /Users/liaowenx…

客户说发货慢怎么回复_?沐言恋爱学:当女生说“我累了”,怎么回复最合适?...

沐言恋爱学&#xff1a;当女生说“我累了”&#xff0c;怎么回复最合适&#xff1f;学员提问&#xff1a;沐言解答&#xff1a;01兄弟你在考虑该怎么回复她之前你需要做的不仅仅是直接读懂她的字面意思而是需要了解事情背景比如&#xff1a;时间她经历的事情是不是身体不太舒服…

react 线程_React式服务中的线程本地状态可用性

react 线程任何架构决策都需要权衡。 如果您决定采用React式&#xff0c;也没有什么不同&#xff0c;例如&#xff0c;一方面使用React式流实现几乎可以立即获得更好的资源利用率&#xff0c;但另一方面会使调试更加困难。 引入React式库也对您的域产生巨大影响&#xff0c;您的…

iTerm2的使用技巧及快捷键

文章目录查看剪贴板内容清屏切换全屏切屏/分屏切换标签栏移动标签栏编辑会话打开最近的目录复制粘贴查找移动光标搜索历史命令查看历史命令删除滚屏界面窗口缩放搜索会话/配置文件/快照展开&#xff08;Expose&#xff09;所有的标签窗口操作查看当前终端中光标的位置开启和关闭…

位运算和进制转换,反码补码

进制转换 package junit;public class Test {public static void main(String[] args) { // int aInteger.MIN_VALUE;int bInteger.MAX_VALUE;int cInteger.MIN_VALUE;System.out.println(b);System.out.println(c);print(b);// 最高位表示 符号位 最高位0 表示正数 …

python绘制pr曲线图_如何利用Python制作可以动的动态图表。

来源&#xff1a;机器之心原文链接&#xff1a;https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce780421afe在读技术博客的过程中&#xff0c;我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的&#xff1f;难…

switch字符串jdk_JDK 12 Early Access Build 12中的原始字符串文字支持

switch字符串jdk本周Java世界上最大的新闻可能是JDK 11的通用性。 但是&#xff0c;另一个令人兴奋的发展是JDK 12 Early Access Build 12的发布 &#xff08; 2018年9月20日 &#xff09;。 JDK 12的这个早期访问生成12是显著&#xff0c;因为它包括与实施方式中JEP 326 [“原…

MacOS安装pip失败,提示:SyntaxError: invalid syntax

使用命令 easy_install 安装 pip 使用命令 sudo easy_install pip 安装 pip&#xff0c;结果失败了&#xff0c;执行命令的信息如下&#xff1a; ➜ ~ sudo easy_install pip Password: Searching for pip Reading https://pypi.org/simple/pip/ Downloading https://files.…

java压缩视频

引入依赖 <dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.0.0</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-all-dep…