当前位置: 首页 > 知识库问答 >
问题:

如何确保编译时枚举开关的完整性?

鄢修德
2023-03-14

我有几个switch语句测试枚举。所有<code>enumenum可能会收缩和增长。当<code>枚举

已经存在“如何检测新值已添加到枚举中并且未在开关中处理”的问题,但它不包含答案,而只是与Eclipse相关的工作。

共有3个答案

萧鹏云
2023-03-14

我不知道标准的Java编译器,但Eclipse编译器当然可以配置为对此发出警告。转到窗口-

年烈
2023-03-14

另一种解决方案使用函数式方法。您只需要根据下一个模板声明枚举类:

public enum Direction {

    UNKNOWN,
    FORWARD,
    BACKWARD;

    public interface SwitchResult {
        public void UNKNOWN();
        public void FORWARD();
        public void BACKWARD();
    }

    public void switchValue(SwitchResult result) {
        switch (this) {
            case UNKNOWN:
                result.UNKNOWN();
                break;
            case FORWARD:
                result.FORWARD();
                break;
            case BACKWARD:
                result.BACKWARD();
                break;
        }
    }
}

如果您尝试在至少没有一个枚举常数的情况下使用它,将会得到编译错误:

getDirection().switchValue(new Direction.SwitchResult() {
    public void UNKNOWN() { /* */ }
    public void FORWARD() { /* */ }
    // public void BACKWARD() { /* */ } // <- Compilation error if missing
});
艾意蕴
2023-03-14

在有效Java中,Joshua Bloch建议创建一个抽象方法,该方法将为每个常量实现。例如:

enum Color {
    RED   { public String getName() {return "Red";} },
    GREEN { public String getName() {return "Green";} },
    BLUE  { public String getName() {return "Blue";} };
    public abstract String getName();
}

这将作为一个更安全的开关,如果您添加一个新常量,则强制您实现该方法。

编辑:为了澄清一些混淆,以下是使用常规开关的等效项:

enum Color {
    RED, GREEN, BLUE;
    public String getName() {
        switch(this) {
            case RED:   return "Red";
            case GREEN: return "Green";
            case BLUE:  return "Blue";
            default: return null;
        }
    }
}
 类似资料:
  • 问题内容: 我有几个测试一个的switch语句。所有值必须在语句中由语句处理。在代码重构期间,可能会发生收缩和增长。当收缩时,编译器将引发错误。但是,如果增长,则不会引发任何错误。匹配状态被遗忘并产生运行时错误。我想将此错误从运行时移到编译时。从理论上讲,应该可以在编译时检测到丢失的情况。有什么办法可以做到这一点? 问题答案: 另一种解决方案使用功能方法。您只需要根据下一个模板声明枚举类: 如果尝

  • 问题内容: 我刚刚开始学习数据库设计,并且我正在与Oracle 11G和SQL Developer一起工作。 我对数据库有以下3条业务规则: 每个官员必须注册一个并且只能注册一个保险公司。每个保险公司可以注册一名或多名官员 每个保险公司必须提供至少五种不同类型的保险类型。每种保险类型最多可以由4个保险公司提供,或者根本不提供 每个保险类型可以由一个或多个官员来订阅。每个官员最多可以订阅同一家公司提

  • 我正在Java Spring/Hibernate中使用Swagger-UI。Swagger UI版本是2。 我很难使用枚举。

  • 我想在Java中创建一个开关/大小写语句,并确保所有字符串都在语句中。 然而,在Java中使用简单的字符串(即北、南、东、西)创建枚举很容易。 对于带点和空格的字符串会怎么做?即“这是描述”,“com.stackoverflow.ClassName”

  • 我有一个注释要求是编译时常量。我从下面的中获取: 我的s如下: 当我使用注解Kotlin需要是编译时常量。 注释实现本身: 我仔细研究了类似的问题,但没有找到解决方法。我还找到了一篇与这个主题相关的文章,但到目前为止没有任何效果。 附带说明:我不能更改注释,因为它来自库,我也不能更改库。 总而言之,有没有办法从静态编程语言中的编译时常量到注释中使用?

  • 问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S