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 枚举

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

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

    正如我在" 玩JDK 12的Switch表达式 "一文中所写的那样, JDK 12 Early Access Build使JEP 325的实现(" Switch Expr ...

  2. jdk 流合并_JDK 12,合并的收集器和命名的挑战

    jdk 流合并 看来可能是一种新的方法,将可在java.util.streams.Collectors类JDK 12即会,根据新方法的提出了基于Javadoc的文档,"返回一个收藏家是将输入 ...

  3. ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式

    ubuntu安装jdk语句 我的上一篇文章" 玩JDK 12的Switch表达式 "讨论了使用JDK 12 Early Access Builds尝试JEP 325 switch ...

  4. Java 12:使用开关表达式进行映射

    在本文中,我们将研究Java 12的新功能" Switch Expressions",以及如何与Java 12结合使用. Stream::map操作和其他一些Stream操作. 了 ...

  5. jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式

    jdk8切换成jdk6 JEP 12 ["预览语言和VM功能"]在其主页上描述如下: 预览语言或VM功能是Java SE平台的一项新功能,该功能已完全指定,完全实现但不是永久性的. ...

  6. JDK语言功能预览:切换表达式

    JEP 12 ["预览语言和VM功能"]在其主页上描述如下: 预览语言或VM功能是Java SE平台的一项新功能,该功能已完全指定,完全实现但不是永久性的. JDK功能发布中提供了 ...

  7. java枚举变量带括号_Java~如何使用Enum(枚举)和Lambda表达式

    文章目录 Enum的使用 switch中使用 常见方法 values() 以数组形式返回枚举类型的所有成员 ordinal() 获取枚举成员的索引位置 valueOf() 将普通字符串转换为枚举实例 ...

  8. 编写程序,将一年中 12 个月,建立一个枚举类型数据,并对其进行调用

    package HomeWork; public class Test26 {     /*      * 编写程序,将一年中 12 个月,建立一个枚举类型数据,并对其进行调用.      */    ...

  9. 12.郝斌C语言笔记——枚举

    什么是枚举 把一件事所有可能的取值一一列举出来 怎样使用枚举 例如:#include <stdio.h>//只定义了一个数据类型,并没有定义变量,//该数据类型的名字是 enum Week ...

最新文章

  1. 0x05.基本算法 - 排序
  2. DLL version issue and SQL Parameters Issue
  3. sql server 2008 身份验证失败 18456
  4. Shell脚本完成hadoop的集群安装
  5. 深度学习之TensorFlow 第三章基本开发步骤--以逻辑回归拟合二维数据为例(转)
  6. 【Python】 html解析BeautifulSoup
  7. 浅谈Spring如何利用三个缓存Map解决循环依赖
  8. 利用小波分解后,频率计算问题
  9. HYSBZ 2818 Gcd
  10. Spreadsheet
  11. SPH算法简介(四): Hello, SPH
  12. 百度云提速方法 免费+非破解+不下载软件
  13. Android 机顶盒TV app开发
  14. 《业务安全大讲堂》——2022全年大回顾!
  15. WMS仓储管理系统解决方案能帮助电子企业解决哪些问题
  16. 厚物科技PXIe/PXI一体化测控平台HW-1043d
  17. C语言实现STL静态链表,先进后出的数据结构-栈 一
  18. 三维空间刚体变换:旋转矩阵
  19. MATLAB高斯陷波滤波图像
  20. xdoj-消除类游戏

热门文章

  1. 2020 CSP-S 游记
  2. 洛谷P4727:图的同构计数(Polya引理)(dfs)
  3. 洛谷P2680:运输计划(倍增、二分、树上差分)
  4. CF476D-Dreamoon and Sets【结论】
  5. hdu4609 3idiots 三角形计数 FFT
  6. K8S Learning(2)——集群环境搭建
  7. Hadoop入门(三)HDFS API
  8. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
  9. 性能优化之抛弃Calendar
  10. MySQL datediff()函数