枚举和最终变量有什么区别?

Mar*_*sen 5 java enums

我正在尝试阅读枚举以更好地理解它们.

从枚举的javadocs我得到以下内容:

枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量.

对我来说,这听起来很像一个final变量.

  1. 真正的区别是什么?
  2. 你什么时候用一个而不是另一个?
  3. 枚举只是一个可以成为一组事物的最终变量吗?

Kon*_*kov 6

不同之处在于枚举提供了类型安全性.

我们有这个enum.

public enum MuEnum {
    FIRST("First"), SECOND("Second");

    private String value;

    MyEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

请考虑以下示例:

public void myMethod(MyEnum parameter) { .. }
Run Code Online (Sandbox Code Playgroud)

在这里,您只能传递MyEnum值(FIRSTSECOND),而如果您的方法签名是:

public void myMethod(String parameter) { .. }
Run Code Online (Sandbox Code Playgroud)

你将能够传递一个无效的参数(一些String内容不同于"First""Second").


Sot*_*lis 3

当你有一个enum喜欢的时候

public enum MyEnum {
   FIRST_COSTANT, SECOND_CONSTANT;
}
Run Code Online (Sandbox Code Playgroud)

你实际拥有的是

public class /* enum */ MyEnum extends Enum<MyEnum> {
    private Enum() {}
    public final static MyEnum FIRST_CONSTANT = new MyEnum() {};
    public final static MyEnum SECOND_CONSTANT = new MyEnum() {};    
    ... // methods     
}
Run Code Online (Sandbox Code Playgroud)

所以从这个意义上说,是的,它们是相同的。

此处的Java 语言规范对此进行了解释。

除了枚举类型 E 继承自 Enum 的成员之外, 对于每个声明的名为 n 的枚举常量,枚举类型还有一个隐式声明的名为 n 的类型 E 的 public static final 字段。这些字段被认为是按照与相应枚举常量相同的顺序声明的,位于枚举类型中显式声明的任何静态字段之前。每个这样的字段都被初始化为与其对应的枚举常量。每个这样的字段也被认为是由与相应的枚举常量相同的注释来注释的。枚举常量据说是在初始化相应字段时创建的。