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,一经查实,立即删除!

相关文章

【渝粤题库】国家开放大学2021春3897商务英语1题目

试卷代号&#xff1a;3897 2021年春季学期期末统一考试 商务英语1 试题 2021年7月 注 意 事 项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考.试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收…

【渝粤题库】国家开放大学2021春3983品牌管理题目

试卷代号&#xff1a; 3983 2021年春季学期期末统一考试 品牌管理 试题 2021年7月 一、单项选择题&#xff08;在各题的备选答案中&#xff0c;只有1项是正确的&#xff0c;请将正确答案的序号填写在题中的括号内&#xff0c;每个小题2分&#xff0c;共20分&#xff09; 1.帮助…

【渝粤题库】广东开放大学 基础写作 形成性考核

选择题 题目&#xff1a;写作客体的&#xff08; &#xff09;&#xff0c;决定了写作材料是写作活动的物质基础&#xff0c;决定了选材要真实、确凿。 题目&#xff1a;对想象能力表述错误的一项是&#xff1a;&#xff08; &#xff09;。 题目&#xff1a;写作主体理…

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

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

【渝粤题库】广东开放大学 社会保障法 形成性考核

选择题 题目&#xff1a;社会保障法是调整社会保障关系的法律规范的总称&#xff0c;包括社会保障基本法律、有关社会保障的其他法律和行政法规&#xff0c;以及具有法律效力的有关社会保障的地方性法规和各级政府规章 题目&#xff1a;社会保障法的主体是由社会保障法认可或者…

休眠面试问答-最终清单

这是有关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表示进度条的比例长度…

【渝粤题库】广东开放大学 人力资源管理 形成性考核

选择题 题目&#xff1a; 人力资源管理的一个基本假设就是&#xff0c;企业有义务最大限度地利用员工的 &#xff0c;并要为每一位员工都提供一个不断成长以及挖掘个人最大潜力和建立成功职业的机会&#xff08; &#xff09;。 A.能力 B.知识 …

【渝粤题库】广东开放大学 商务交际听说 形成性考核

选择题 题目&#xff1a;It is cven harder to land a new ccount these days.这些日子以来愈来愈难开新账号了 题目&#xff1a;I can assure you that the problem will be identified and addresed. 题目&#xff1a;我们行程是否有就误?Are we on schedule? 题目&#xf…

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…

【渝粤题库】广东开放大学 工程经济 形成性考核

选择题 题目&#xff1a;下列是年金现值系数表示符号的是&#xff08;&#xff09; 题目&#xff1a;某施工企业现在对外投资200万元&#xff0c;5年后一次性收回本金和利息&#xff0c;若年基准收益率为8%&#xff0c;则总计可以收回资金&#xff08;&#xff09;万元已知&…

Java 11:将集合转换为数组

在Java 11中&#xff0c;新的默认方法toArray(IntFunction)已添加到java.util.Collection接口&#xff0c;该接口允许将集合的元素传输到所需运行时类型的新创建的数组。 例如&#xff1a; // Java 11 List<String> list Arrays.asList("foo","bar&quo…

【渝粤题库】广东开放大学 微信平台开发与应用 形成性考核

选择题 题目&#xff1a; 以下哪些功能是属于微信的&#xff1f; 题目&#xff1a; 认证过的订阅号的底部是否可以直接链接到外部链接&#xff1f; 题目&#xff1a; 下面哪些属于页面前端开发技术&#xff1f; 题目&#xff1a; 那种情况下的公众号可以申请微信支付&#xff1…

various,variable,varied,different, diverse的区别

various 和 varied various 和 varied的意思都是“各种各样的&#xff0c;形形色色的”&#xff0c;但强调点不同&#xff1a;various 侧重多样性&#xff0c;varied 侧重与众不同。 比较&#xff1a; He decided to leave school for various reasons. 出于种种原因&#xff…

【渝粤题库】广东开放大学 服务质量管理 形成性考核

选择题 题目&#xff1a; 在Word2010中&#xff0c;使用“自动更正”功能的步骤是单击“文件”→“选项”→“校对”选项卡&#xff0c;在“自动更正选项”区域单击“自动更正选项”按钮。 选择一项&#xff1a; 题目&#xff1a; 在Word2010中图片被裁剪后&#xff0c; 被裁…

cglib_cglib:缺少的手册

cglib字节码检测库cglib在许多众所周知的Java框架&#xff08;例如Hibernate &#xff08;现在不再 &#xff09;或Spring &#xff09;中很受欢迎&#xff0c;它们可以完成肮脏的工作。 字节码检测允许在Java应用程序的编译阶段之后操作或创建类。 由于Java类是在运行时动态链…

【渝粤题库】广东开放大学 现代服务学概论 形成性考核 (2)

选择题 题目&#xff1a;为什么需要课本&#xff1f; 题目&#xff1a;以下哪种考核方式可以多次尝试&#xff0c;多次取得成绩&#xff0c;直到取得理想的分数&#xff1f; 题目&#xff1a;你可以通过哪些方法联系到本课程的责任教师&#xff1f; 题目&#xff1a;可以通过哪…

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

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

【渝粤题库】广东开放大学 网络营销基础与实践 形成性考核 (2)

选择题 题目&#xff1a;下列关于网络营销的观点正确的是&#xff08; &#xff09; 题目&#xff1a;B2B2B模式是商业模式的一种。 题目&#xff1a;市场细分的方法有4种方法&#xff0c;分别为完全细分、按一个影响需求的因素细分、按两个以上影响需求的因素细分、按市场需求…

Java Lambda流和Groovy Clouse的比较

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