对于建议抛出异常的人:
抛出异常不会给我编译时错误,而是给我运行时错误。我知道我会抛出异常,我宁愿在编译时死掉,也不愿在运行时死掉。
首先,我正在使用Eclipse 3.4。
我有一个数据模型,其模式属性是枚举。
enum Mode {on(...), off(...), standby(...); ...}
我目前正在编写此模型的视图,并且我有代码
...
switch(model.getMode()) {
case on:
return getOnColor();
case off:
return getOffColor();
case standby:
return getStandbyColor();
}
...
我收到一个错误“此方法必须返回类型为java.awt.Color的结果”,因为我没有默认大小写,并且在函数末尾没有返回xxx。在有人向枚举添加另一种类型的情况下,我想要一个编译错误(例如,关闭),所以我不想放置一个引发AssertionError的默认情况,因为这将使用修改后的Mode进行编译,而不被视为直到运行时错误。
我的问题是:
为什么EclipseBuilder(和javac)不认识到此开关涵盖了所有可能性(或者它涵盖了所有可能性?),并停止警告我需要返回类型。有没有一种方法可以在不向Mode添加方法的情况下做我想做的事情?
如果失败,是否可以选择对不覆盖所有Enum可能值的switch语句发出警告/错误提示?
编辑:Rob:这是一个编译错误。我只是尝试使用javac进行编译,但针对该方法的最后一个}出现了“ missing return statement”错误。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() );
这要冗长得多,但是如果声明了新的枚举,则会立即出现编译错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句