在接口中声明枚举时出错

时间:2016-11-11 17:16:29

标签: java enums interface

我们的想法是创建一个包含枚举的接口,该枚举将保存县代码,以便稍后可以将其用作对象中变量的值。

它应该是这样的:

public interface CountrCodes {

  public enum Countries { france(FR), germany(D), spain(ES), portugal(PT)};

}

但IDE(Eclipse)正在和我争论:

> Syntax error, insert ")" to complete Expression
>   - 'enum' should not be used as an identifier, since it is a reserved keyword from source level 1.5       on
>   - enum cannot be resolved to a type
>   - PT cannot be resolved to a variable
>   - ES cannot be resolved to a variable
>   - Syntax error on token ")", delete this token
>   - Syntax error, insert ";" to complete BlockStatements
>   - D cannot be resolved to a variable
>   - Syntax error, insert ";" to complete FieldDeclaration
>   - F cannot be resolved to a variable

这是我第一次使用枚举,我感到困惑,因为我认为在界面中使用枚举是绝对合法和正确的。我怎样才能使它发挥作用?

4 个答案:

答案 0 :(得分:1)

外部接口不需要完成您尝试完成的任务。在其自己的文件(Countries.java)中定义枚举:

public enum Countries {
    FRANCE("FR"), GERMANY("D")

    private Countries(code) {
        this.countryCode = code;
    }

    private String countryCode

}

应该得到你所需要的,尽管正如其他人所说,这不是一个非常有用的枚举。

答案 1 :(得分:1)

如果你真的不想在自己的文件中定义枚举(参见rmlan answer)。

这就是你要找的东西:

public interface CountrCodes {

  public enum Countries { FRANCE, GERMANY, SPAIN, PORTUGAL};

}

答案 2 :(得分:1)

你想做什么,被称为内部枚举。一个在课堂里面的枚举,没什么特别的,也没什么复杂的。完全合法。公共作为内部阶级。但在这种情况下,它是一个枚举。

枚举是另一种对象,如类,但它们还有其他一些属性。例如,枚举是线程安全的,它们是可序列化的。

您的特定示例没有问题。它不编译,因为编译器无法解析FR,D,ES和PT。如果我删除这些国家/地区代码,则使用Java 8进行编译。

有关更多参考资料,请查看此处:

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

答案 3 :(得分:1)

我无法确定接口声明何时可能具有嵌套成员,但至少可以使用嵌套成员,因为至少Java 7。

如果定义一个接口,其中一组常量可用于主要使用该接口,则可以方便地将常量嵌套为接口中的枚举类。这是一个完全可以接受的接口用例。考虑一下你自己的代码:

public interface CountryCodes {

    public enum Countries { france(FR), germany(D), spain(ES), portugal(PT)};

}

很明显,您希望将枚举类Countries嵌套在接口CountryCodes中(因为单个枚举常量是单一的,我建议不要使用复数作为枚举类名,例如。Country.SPAIN而不是Countries.SPAIN;枚举常量应按照惯例在所有大写中命名。)

然而,您的声明中的不同之处在于您显然希望将数据与常量相关联。因此,您的枚举类需要一个实例字段和一个构造函数:

public interface CountryCodes {

    public static enum Country {
        FRANCE("FR"),
        GERMANY("DE"),
        SPAIN("ES"),
        PORTUGAL("PT");

        private final String e_countryId;

        private Country(String c) {
            this.e_countryId = c;
        }
    }
    :
    :
}

枚举类声明中的标识static是不必要的。我喜欢将它包含在内,以明确枚举是一个嵌套成员。