对于建议抛出异常的人:
抛出异常不会给我带来编译时错误,它会给我带来运行时错误。我知道我可以抛出异常,我宁愿在编译期间死也不愿在运行时死。
首先,我使用的是 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 类型的结果”,因为我没有默认情况,并且函数末尾没有 return xxx。I want如果有人向枚举添加另一种类型(例如关闭),则会出现编译错误,因此我不想放置抛出 AssertionError 的默认情况,因为这将使用修改后的模式进行编译,并且直到运行。
我的问题是这样的:
为什么 EclipseBuilder(和 javac)不认识到这个开关涵盖了所有可能性(或者它涵盖了它们?)并停止警告我需要返回类型。有没有办法可以在不向模式添加方法的情况下做我想做的事情?
如果做不到这一点,是否有一个选项可以对未涵盖所有枚举可能值的 switch 语句发出警告/错误?
编辑:
Rob:这是一个编译error。我只是尝试用 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() );
这要详细得多,但如果声明了新的枚举,您会立即收到编译错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)