当前位置: 首页 > 面试题库 >

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

贲文景
2023-03-14
问题内容

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

首先,我正在使用Eclipse 3.4。

我有一个数据模型,它的mode属性是Enum。

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进行编译,但针对该方法的最后一个}出现了“缺少返回语句”错误。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() );

这更加冗长,但是如果声明了新的枚举,您将立即得到编译错误。



 类似资料:
  • 所以基本上我有一个学校的项目,它包含一个time循环中的开关语句。 假设我输入“1”,它在大小写“1”中运行代码。然后它应该在之后中断。但默认代码也总是运行。 这是案例“1”代码: 这是默认代码: 以下是输出: 我很有信心我的代码是正确的,但是如果我缺少什么,请告诉我如何修复它,谢谢。

  • 本文向大家介绍Java语言中枚举能使用switch语句吗?,包括了Java语言中枚举能使用switch语句吗?的使用技巧和注意事项,需要的朋友参考一下 Java中的枚举(enum)是一种存储一组常量值的数据类型。您可以使用枚举来存储固定值,例如一周中的天,一年中的月等。 您还可以使用自定义值定义一个枚举来声明常量。但是您需要一个实例变量,一个构造函数和一个getter方法来返回值。 与switch

  • 所以基本上我有一个学校项目,它在while循环中包含一个switch语句。 假设我输入“1”,它运行案例“1”中的代码。然后它会在之后破裂。但默认代码也总是可以运行。 以下是案例“1”代码: 这是默认代码: 以下是输出: 我很有信心我的代码是正确的,但是如果我缺少什么,请告诉我如何修复它,谢谢。

  • 问题内容: 只是想弄清楚如何对Java switch语句使用多种情况。这是我要执行的操作的一个示例: 与必须要做的事情: 有什么想法,如果可能的话,或者什么是好的选择? 问题答案: 可悲的是,这在Java中是不可能的。您将不得不使用using 语句。

  • 我有两种枚举类型(并希望用户能够添加自己的)。 如果我不在接受枚举类型的方法中使用枚举属性,这就很好。 但是,如果我希望模板E被识别为一个枚举(在这里的开关中使用),我会得到错误“不能打开类型E的值”(在Eclipse中,开关(E)中的“E”带有红色下划线) 我对擦除有一点了解,它在编译时擦除了关于模板的所有信息,所以这就是问题所在。但是我尝试传入clazz类或者实现一个接口都没有成功。对此有什么

  • 我想这样做: 这样的事情可能吗?我想防止代码重复。我知道在这个特定的示例中,没有什么理由这样做,因为重复的代码很小。我能想到的唯一一件事是这样的(使用开关盒的穿透能力): 我宁愿不这样做,因为增加案例数量并在底部设置默认值会更有意义。 但我想知道,如果我这样做,它会不会搞乱引擎盖下的goto语句?特别是,由于数字或顺序错误,决定使用哪个goto语句不会花费更长的时间吗?switch语句中的顺序重要