假设您有一个包含3个值的枚举:
enum Colors { RED, GREEN, BLUE }
你用某种方法转换它的所有值,认为你已经处理了所有的情况:
switch (colors) {
case RED: ...
case GREEN: ...
case BLUE: ...
}
然后,稍后向枚举添加新值:
enum Colors { RED, GREEN, BLUE, YELLOW }
一切仍然编译正常,除了你在方法中默默地错过了一个黄色
的案例。有没有办法在这种情况下引发编译时错误?
编辑:不明白为什么这被标记为在Java中运行时添加和删除枚举元素的重复。由于答案是“否”,这意味着在编译时应该知道枚举的所有值,因此我所要求的应该是编译器/某些代码分析工具实现的,对吧?
我不认为有一种默认的方法来做到这一点。使用一些外部工具可能是可能的。
为什么不在switch语句中提供默认值并引发异常。此外,你应该有足够的单元测试来测试这个场景,如果你编译了你的项目并且所有的单元测试都没问题,这意味着你测试的不够深入。
这取决于编译器。Eclipse IDE内置编译器可以配置为在这种情况下引发错误。
Windows/首选项 Java 编译器错误/警告 “枚举上不完整的'切换'情况”可以设置为“错误”。
编辑:
甚至还有一个子选项“即使存在‘默认’情况也发出信号”。
不。但枚举是类。因此,您可以使用多态性:
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调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用