热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

正如我在“玩JDK12的Switch表达式”一文中所写的那样,JDK12EarlyAccessBuild使JEP325的实现(“SwitchExpres

正如我在“ 玩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 [" &#43; response.name() &#43; "]:");switch (response){case YES:out.println("Si!");break;case NO:out.println("No!");break;}}public static void printResponseStringFromExpression(final Response response){out.println("Expression [" &#43; response.name() &#43; "]:");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 &#39;dustin.examples.jdk12.switchexp.Response&#39; string as an argument.");System.exit(-1);}final String responseString &#61; arguments[0];out.println("Processing string &#39;" &#43; responseString &#43; "&#39;.");final Response response &#61; Response.valueOf(responseString);printResponseStringFromStatement(response);printResponseStringFromExpression(response);}
}

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

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

开关表达

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

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

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



推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
Carmen果果时代
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有