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

有没有办法强制你在Java中切换枚举的所有定义值?[重复]

谯阳伯
2023-03-14

假设您有一个包含3个值的枚举:

enum Colors { RED, GREEN, BLUE }

你用某种方法转换它的所有值,认为你已经处理了所有的情况:

switch (colors) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}

然后,稍后向枚举添加新值:

enum Colors { RED, GREEN, BLUE, YELLOW }

一切仍然编译正常,除了你在方法中默默地错过了一个黄色的案例。有没有办法在这种情况下引发编译时错误?

编辑:不明白为什么这被标记为在Java中运行时添加和删除枚举元素的重复。由于答案是“否”,这意味着在编译时应该知道枚举的所有值,因此我所要求的应该是编译器/某些代码分析工具实现的,对吧?

共有3个答案

姜学海
2023-03-14

我不认为有一种默认的方法来做到这一点。使用一些外部工具可能是可能的。

为什么不在switch语句中提供默认值并引发异常。此外,你应该有足够的单元测试来测试这个场景,如果你编译了你的项目并且所有的单元测试都没问题,这意味着你测试的不够深入。

何晗昱
2023-03-14

这取决于编译器。Eclipse IDE内置编译器可以配置为在这种情况下引发错误。

Windows/首选项 Java 编译器错误/警告 “枚举上不完整的'切换'情况”可以设置为“错误”。

编辑:

甚至还有一个子选项“即使存在‘默认’情况也发出信号”。

孟建木
2023-03-14

不。但枚举是类。因此,您可以使用多态性:

enum Color { 
    RED {
        @Override
        public void foo() { ... }
    },
    GREEN {
        @Override
        public void foo() { ... }
    },
    BLUE {
        @Override
        public void foo() { ... }
    };

    public abstract void foo();
}

现在,如果您添加一种颜色,编译器不会让您添加它,它不会覆盖抽象方法。

而不是

switch (color) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}

你可以直接用

color.foo();

请注意,Kotlin允许做你想做的事情,如果Kotlin是一个选项。

另请注意,BLUE是一种颜色,而不是颜色。因此枚举应命名为Color,而不是Colors。

 类似资料:
  • 问题内容: 内容: 我想说的是: 问题答案: 一种方法是手动处理此问题: 使用包装(扩展) 只要设置了值,就保留()线程和值 或者,通过一些反射(和),您可以: 呼叫 调用(针对上述每个线程) 呼叫 第一是更优选的。

  • 问题内容: 我知道该信息在枚举中可用。 如何打印所有枚举值,如:? 输出: 姓名 教育 电子邮件 电话 如何在另一个函数中将该枚举作为arg 传递? 问题答案: 您的第二部分…与或一样

  • 假设我有以下代码: 是否有一种方法可以得到下面的数组?

  • 问题内容: 我遇到了这个问题,我不知道需要迭代其实际值的实际类型。 任何想法如何从enumValue中提取其可能的值? 问题答案:

  • 问题内容: 什么是C#的Java等价物: 问题答案: 如果需要属性,则需要这样定义: 您可以这样使用它: 要意识到的是,这只是创建类的捷径,因此您可以向该类添加所需的任何属性和方法。 如果您不想在自己的方法上定义任何方法,则可以更改成员变量的范围并进行设置,但这不是它们在Sun网站上的示例中所做的。

  • 问题内容: 我有一个方法返回基类的集合: 由于()的返回类型与方法()的返回类型不匹配,因此无法编译。我理解为什么会这样:由于泛型类型不同,所以两个类之间没有继承关系。 有很多方法可以解决编译器错误,从将方法的返回类型更改为不使用Arrays.asList并将派生对象之一转换为Base。 当解析Arrays.asList调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用