当前位置: 首页 > 知识库问答 >
问题:

强制穷举切换

穆鸿卓
2023-03-14

是否有注释或其他方法可以将非穷举的 switch 语句警告转换为错误?我希望某个方法或类在开关中未正确处理所有值,则会产生错误。

示例:

public enum E {
  A,
  B
}

在代码中的其他地方,该枚举上有一个开关,如下所示

switch (enumValue) {
case A: /* do something */ break;
}

Java会给您一个警告,该开关不会处理所有枚举值。我想把这个警告变成一个错误(永久性的,不管个别IDE设置如何)。

请记住,在这种情况下,我无法更改原始枚举,因此我希望编译器强制执行它。

共有3个答案

壤驷安和
2023-03-14

嗯,您可能可以更改IDE中的设置,将警告变为错误。

例如,在Eclipse的<代码>窗口下-

如果switch语句不在枚举上,那么强制指定所有的case是没有意义的,因为会有大量的case。

濮阳研
2023-03-14

因为这是一个枚举,而不是switch语句,所以可以使用抽象方法;所有枚举值都必须实现它。例如:

public enum MyEnum
{
    A {
        @Override public void foo() { /*whatever*/ }
    }
    // etc

    public abstract void foo();
}

然后调用<code>yourEnum。foo()在您需要时使用,而不是像当前那样使用switch语句。

不实现该方法不是一个选项…编译将失败。

漆雕洋
2023-03-14

我知道这是一个旧线程,但在最新的JDK中有一个新的答案:

切换表达式必须详尽无遗,并且可用作 JDK 12 和 13 中的预览语言功能。

https://openjdk.java.net/jeps/354

这意味着您可以将需要验证的switch语句修改为switch表达式,而其他switch语句将继续按预期工作。

 类似资料:
  • 我试图编写函数尾部,它将字符串转换成字符串列表,方式如下: 以下是我的实现: 正如标题所暗示的,这个函数中有一些非详尽的模式。不幸的是,我不明白为什么。 我是哈斯克尔的新手。。。任何帮助都将不胜感激!

  • 我的函数使用一个可能是Int的列表作为参数。如果元素=Nothing,则应打印一个。如果元素是一个Just Int,它将打印数字。我以为我抓住了一个基本情况,但我认为我没有抓住正确的一个。。我得到一个非穷举模式错误。 向正确的方向点头表示感谢!:-)

  • 所以我有这个函数,当我尝试这样使用它时:mergesortedList[1,1][1,1]会给我一个错误: [1,1***异常:SortFunctions.hs:(86,1)-(91,89):函数合并分类列表中的非穷举模式 我无法找出问题的根源,因为我想我已经涵盖了所有可能的案例。这里会有什么问题?

  • 我们正试图找到一种使用JPA来持久化枚举的可靠方法。使用的常见方法是不可取的,因为在重构时破坏映射太容易了。每个枚举都应该有一个单独的数据库值,它可以不同于枚举名称/顺序,这样您就可以安全地更改枚举的名称或内部顺序(例如序数值),而不会破坏任何东西。例如,这篇博客文章有一个如何实现这一目标的示例,但是我们觉得建议的解决方案给代码增加了太多的混乱。我们希望通过使用JPA 2.1中引入的新的机制来实现

  • 我有一个关于使用“永远”类型的穷举开关/情况的问题。 比如说,我有一组字符串:{a,B}(字符串可以是任意长的单词,而且集合本身可能非常大),对于每个子集(比如{},{a,B}),我想创建一个函数:show:Set= 预发伪代码: 是否有可能在编译时保证show函数中包含所有可能的子集?所以把C加到集合{A,B,C}需要我扩充show函数吗?并为{C}、{A,C}、{B,C}和{A,B,C}添加案

  • 问题内容: 苹果文档说 每个switch语句必须详尽无遗。也就是说,所考虑类型的每个可能值都必须与切换条件之一匹配。 所以在新的Xcode中,我放置了这样的代码 现在,如果我删除默认部分,则会出现编译器错误: 切换必须详尽无遗 是否要添加丢失的案例?固定 所以我的问题是我提到的一个案例,因为我没有提到??的所有案例值。但是我仍然遇到错误?为什么会出现此错误,我错过了什么吗? 问题答案: Swift