枚举

public enum PlayerType {
    TENNIS,
    FOOTBALL,
    BASKETBALL
}

Java 编译器帮我们做了很多隐式的工作,看一下反编译后的字节码:

public final class PlayerType extends Enum
{

    public static PlayerType[] values()
    {
        return (PlayerType[])$VALUES.clone();
    }

    public static PlayerType valueOf(String name)
    {
        return (PlayerType)Enum.valueOf(com/cmower/baeldung/enum1/PlayerType, name);
    }

    private PlayerType(String s, int i)
    {
        super(s, i);
    }

    public static final PlayerType TENNIS;
    public static final PlayerType FOOTBALL;
    public static final PlayerType BASKETBALL;
    private static final PlayerType $VALUES[];

    static 
    {
        TENNIS = new PlayerType("TENNIS", 0);
        FOOTBALL = new PlayerType("FOOTBALL", 1);
        BASKETBALL = new PlayerType("BASKETBALL", 2);
        $VALUES = (new PlayerType[] {
            TENNIS, FOOTBALL, BASKETBALL
        });
    }
}
  • 要继承 Enum 类;

  • 要写构造方法;

  • 要声明静态变量和数组;

  • 要用 static 块来初始化静态变量和数组;

  • 要提供静态方法,比如说 values()valueOf(String name)

枚举是一种特殊的类,那它其实是可以定义在一个类的内部的,这样它的作用域就可以限定于这个外部类中使用。

参照 isBasketballPlayer() 方法,由于枚举是 final 的,所以可以确保在 Java 虚拟机中仅有一个常量对象,基于这个原因,我们可以使用“==”运算符来比较两个枚举是否相等。

如果枚举中需要包含更多信息的话,可以为其添加一些字段:

最后更新于