gpt4 book ai didi

Java Enums 和 Switch 语句 - 默认情况?

转载 作者:IT老高 更新时间:2023-10-28 20:24:00 25 4
gpt4 key购买 nike

对于建议抛出异常的人:
抛出异常不会给我一个编译时错误,它会给我一个运行时错误。我知道我可以抛出异常,我宁愿在编译期间死,也不愿在运行时死。

首先,我使用的是 eclipse 3.4。

我有一个数据模型,它的模式属性是枚举。

enum Mode {on(...), off(...), standby(...); ...}

我目前正在编写这个模型的 View 并且我有代码

...
switch(model.getMode()) {
case on:
return getOnColor();
case off:
return getOffColor();
case standby:
return getStandbyColor();
}
...

我收到错误“此方法必须返回 java.awt.Color 类型的结果”,因为我没有默认情况,并且在函数末尾没有返回 xxx。想要在有人向枚举添加另一种类型(例如关闭)的情况下出现编译错误,所以我不想放置一个引发 AssertionError 的默认情况,因为这将编译使用修改后的模式,直到运行时才会被视为错误。

我的问题是:
为什么 EclipseBuilder(和 javac)无法识别此开关涵盖了所有可能性(或者它是否涵盖了它们?)并停止警告我需要返回类型。有没有一种方法可以在不向模式添加方法的情况下做我想做的事?

如果做不到这一点,是否有选项可以对未涵盖 Enum 的所有可能值的 switch 语句发出警告/错误?

编辑:Rob:这是一个编译错误错误。我刚刚尝试用 javac 编译它,我得到一个针对该方法的最后一个 } 的“缺少返回语句”错误。 Eclispe 只是将错误放在方法的顶部。

最佳答案

您总是可以使用带有访问者模式的枚举:

enum Mode {
on {
public <E> E accept( ModeVisitor<E> visitor ) {
return visitor.visitOn();
}
},
off {
public <E> E accept( ModeVisitor<E> visitor ) {
return visitor.visitOff();
}
},
standby {
public <E> E accept( ModeVisitor<E> visitor ) {
return visitor.visitStandby();
}
}

public abstract <E> E accept( ModeVisitor<E> visitor );

public interface ModeVisitor<E> {
E visitOn();
E visitOff();
E visitStandby();
}
}

然后你会实现类似下面的东西:

public final class ModeColorVisitor implements ModeVisitor<Color> {
public Color visitOn() {
return getOnColor();
}

public Color visitOff() {
return getOffColor();
}

public Color visitStandby() {
return getStandbyColor();
}

}

您可以按如下方式使用它:

return model.getMode().accept( new ModeColorVisitor() );

这要冗长得多,但如果声明了新的枚举,你会立即得到一个编译错误。

关于Java Enums 和 Switch 语句 - 默认情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/859563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com