Java枚举和开关语句-默认情况?

KitsuneYMG:

对于建议抛出异常的人:
抛出异常不会给我编译时错误,而是给我运行时错误。我知道我会抛出异常,我宁愿在编译时死掉,也不愿在运行时死掉。

首先,我正在使用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只是将错误放在方法的顶部。

mtpettyp:

您可以始终使用带有访客的枚举模式:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java的强制默认return语句从方法与枚举开关与所有枚举值覆盖

有switch语句的默认情况下调用先前的案例?

熊猫-熊猫出现时和默认情况

Java默认情况下是否声明“引发异常”?

开关中的“默认”情况是否必须排在最后?

Servlet仅在默认开关情况下被调用

默认情况下,将Java ENUM打印为小写,将枚举常量保持为大写

默认情况下,枚举实例是静态的吗?

Java和.NET:为什么默认情况下使用不同的排序算法?

select语句的默认情况持续执行

在switch语句中使用默认情况下的继续

C#-在默认情况下获取开关值

Kubernetes的默认活动和准备情况探针

在没有默认情况下,快速开关是否可以穷尽Double类型?

默认情况下忽略所有字段和属性

在R中使用拨动开关时,如何在默认情况下打开边栏

使用字符串和枚举映射时,Switch执行第一种情况而不是默认情况

默认情况下,如何在枚举中将元素评估为它们的值?

默认情况下是否安装Java?

在这种情况下,我需要“默认”语句吗?

Java switch语句在枚举上变为默认值

Java默认情况下在ScriptEngine中加载脚本

Java-For循环,带有带默认情况的switch语句。如何获得默认情况下仅打印一次输出?

Java-开关:情况2和3不起作用

部分切换与if语句中的默认情况为空

其余情况下不使用的其余索引的java开关默认值

为什么switch语句中不是默认值的每种情况都属于例外情况?

如何停止 resharper 删除空的开关默认情况

Python - 默认情况下是套接字和 recv() 阻塞