JDK 12开关表达式遇到意外的枚举值

正如我在“ 玩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表达式的enum和代码的case子句中显式指定所有enum的值时如何支持情况的方法,但后来又添加了更多的值到枚举,而无需使用该枚举重新编译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

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

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

相关文章

Matlab画图线型、符号及颜色设置

1. matlab 中线条的主要属性 Color: 颜色LineStyle: 线型LineWidth: 线宽Marker: 标记点的形状MarkerFaceColor: 标记点填充颜色MarkerEdgeColor: 标记点边缘颜色MarkerSize: 标记点大小 2. 各种属性的名称 2.1 线型 -Solid line (default) – Dashed line : Dotted line …

休眠面试问答-最终清单

这是有关Hibernate Framework的一些最重要问题的摘要&#xff0c;可能会要求您在访谈中回答&#xff01; 您无需担心下一次面试的机会&#xff0c;因为Java Code Geeks在这里为您服务&#xff01; 您可能会被问到的大多数事情都收集在下面的列表中。 我们的Hibernate面试问题将…

matlab 进度条/waitbar 显示运行进度

当运行大程序&#xff0c;需要跑大量数据的时候&#xff0c;使用进度条可以看到程序究竟运行到什么地方了&#xff0c;哈哈&#xff0c;要不干等着难受(╯﹏╰)…… waitbar的作用是打开或者更新进度条。 1 语法结构 (1.1) h waitbar(x,‘message’) x表示进度条的比例长度…

MATLAB 命令 BOXPLOT

Matlab中有关boxplot(X)命令的解释&#xff1a; boxplot(X) produces a box and whisker plot for each column of the matrix X. The box has lines at the lower quartile, median, and upper quartile values. Whiskers extend from each end of the box to the adjacent v…

latex-bib参考文献人名特殊字符

https://blog.csdn.net/weixin_43413198/article/details/105468843

Matlab RGB 颜色对照表(0-1之间取值)

https://blog.csdn.net/qq_38882446/article/details/100886087

空间点过程(Point Processes)和随机测度(Random Measure)

1 空间点过程与随机测度&#xff08;一&#xff09;&#xff1a;从数星星说起 1.1 数星星的数学 小时候&#xff0c;在晴朗的夜里&#xff0c;我喜欢仰望星空&#xff0c;去数天上的星星——那是无忧无虑的快乐童年。长大后&#xff0c;当我们再度仰望苍穹&#xff0c;也许会思…

add a legend to a boxplot in MATLAB

1. 给同组数据分类加legend figure; colors [1 0 0; 1 0 0; 0 0 1; 0 0.5 0; 0 0.5 0; 0 0.5 0]; x boxplot(rand(100,6),Colors,colors); legend(Group A,Group B,Group C)2.给不同组数据加legend box_vars findall(gca,Tag,Box); hLegend legend(box_vars([8,6]), {N…

JavaFX技巧31:遮罩/剪切/ Alpha通道

选择条 最近&#xff0c;我不得不实现一个自定义控件&#xff0c;该控件使用户可以从项目列表中选择一个项目。 此“ SelectionStrip”控件必须水平放置项目&#xff0c;并且在项目过多的情况下&#xff0c;允许用户左右水平滚动。 该控件将在空间受限的区域中使用&#xff0c;…

通信中的频谱效率与能量效率

频谱效率(Spectral Efficiency) 频谱效率&#xff08;Spectral Efficiency&#xff0c;SE&#xff09;简称谱效&#xff0c;也称系统容量、频带利用率。 该指标用来衡量系统的有效性&#xff0c;描述了能够提供多少容量。 它定义为系统传输的有效信息速率R除以通信信道带宽B&a…

积分公式大全

https://kexue.fm/sci/integral/ 《积分公式大全》网络版本——By BoJone 引用原作者的话&#xff1a; 本附件所有公式来自《高等数学第三版》。   该书信息&#xff1a;同济大学数学教研室编&#xff0c;高等教育出版社&#xff0c;1988年4月第三版&#xff0c;ISBN 7-04-0…

Latex快速入门系列 -- 在TexStudio中正确插入参考文献的基本操作

目录 1 操作流程2 四种基本的文献格式比较3 文献数据库.bib的编写 1. 操作流程 1.1 创建文章主文件。Ctrl N 新建一个文件&#xff0c;Ctrl S 手动保存&#xff0c;保持文件后缀名.tex。得到一个.tex文件&#xff1a;文章名.tex&#xff0c;该文件用来编写你的文章的具体内…

MongoDB索引策略和索引类型

1. MongoDB索引策略和索引类型–简介 MongoDB是一个开放源代码&#xff0c;面向文档的跨平台数据库&#xff0c;它使用C 开发&#xff0c;并且是最流行和使用最广泛的NoSQL类型数据库之一。 它可在具有键-值对的类JSON文档的顶部运行&#xff0c;其键值对在每个文档中都无法定义…

zeal刷新不出来_推进重涂市场标准化,立邦率先推出刷新服务“八大验收标准”...

点击蓝字【立邦中国】&#xff0c;设置星标关注。7月&#xff0c;立邦刷新服务率先在墙面重涂行业提出突破性的“八大验收标准”&#xff0c;根据不同的涂刷工艺来采用定制化的验收标准&#xff0c;更进一步推动重涂市场的标准化和规范化。自2011年推出立邦刷新服务至今&#x…

初学者指南:如何为Red Hat Process Automation Manager配置电子邮件服务任务

最近&#xff0c;我一直在更新我的免费在线研讨会 &#xff0c;特别是基于JBoss BPM Suite的系列研讨会 &#xff0c;以便您可以开始使用较新的Red Hat Process Automation Manager 。 在本文中&#xff0c;我将分享我在自动化项目中尝试使用电子邮件通知时偶然发现的内容。 …

TDMA 时分多路复用

多路复用 一、什么是多路复用技术&#xff1f; 多路复用技术是把若干个低速信道组成一个高速信道的技术&#xff0c;可以提高数据链路利用率&#xff0c;从而使一条高速的主干链路同时为多条低速的接入链路提供服务&#xff0c;即使网络主干链路可同时运载大量的语音和数据传…

asp 取数据 计算_ASP.NET Core 简介

.NET Core 是 .NET Framework 的新一代版本&#xff0c;是微软开发的第一个具有跨平台 ( Windows、Mac OSX 、Linux ) 能力的应用程序开发框http://ASP.NET Core 是 Microsoft 新开发的&#xff0c;基于 .NET Core 的 Web 开发框架http://ASP.NET Core 是对 http://ASP.NET 的重…

java字节码_掌握Java字节码

java字节码嘿! Happy Advent&#xff1a;D我是ZeroTurnaround的技术布道者Simon Maple&#xff08; sjmaple&#xff09; 。 您知道&#xff0c; JRebel伙计们&#xff01; 由于编写了类似JRebel的产品&#xff0c;该产品与字节码进行交互的结果比您想像中的要多&#xff0c;因…

自由空间激光通信

一、空间激光通信系统 空间激光通信系统是指以激光光波作为载波&#xff0c;大气作为传输介质的光通信系统。自由空间激光通信结合了光纤通信与微波通信的优点&#xff0c;既具有大通信容量、高速传输的优点&#xff0c;又不需要铺设光纤&#xff0c;因此各技术强国在空间激光…

icom对讲机写频线定义_小米对讲机Lite体验:小米全新5公里无网络免费通话神器...

沟通&#xff0c;或者可以简单地把它说成是一种信息的传递。它对于世间的生灵来说&#xff0c;都很重要&#xff01;尤其是对于人类&#xff0c;更为重要&#xff01;由古至今&#xff0c;人们为了可以更好地进行信息的传递&#xff0c;想出了各种各样的办法&#xff0c;比如古…