Java基础之枚举

作为1.5才增加的特性,枚举的使用并不是很多。

枚举其实就是一个比较特殊的类,就如同注解其实也是个特殊的接口一样(注解反编译之后没有了@符号)。枚举使用enum关键字声明,通过反编译自定义的枚举可以看到类似下面的代码:

//源代码
public enum Sex {
    MAN,WOMAN;//如果下面需要定义方法,这里需要加一个分号
}

//反编译结果
public final class Sex extends Enum
{

    public static final Sex MAN;
    public static final Sex WOMAN;
    private static final Sex $VALUES[];

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

    public static Sex valueOf(String s){
        return (Sex)Enum.valueOf(Sex, s);
    }

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

    static {
        MAN = new Sex("MAN", 0);
        WOMAN = new Sex("WOMAN", 1);
        $VALUES = (new Sex[] {
            MAN, WOMAN
        });
    }
}

可以通过反编译结果看到:

  • 自动继承了Enum类
  • 编译器添加了构造方法并私有化
  • MAN,WOMAN被声明为为静态自身类型常量,并且在静态代码块中实例化
  • 添加了values()valueOf()方法

同时,枚举中也可以定义构造方法、成员方法、成员变量、构造代码块、静态代码块等普通类所能定义的东西。但是构造方法必须私有(可以不加权限限定词但默认为private,构造方法既可以有参也可以无参)

常用方法:

  • 继承自Enum类:

    • name():返回枚举常量名称
    • ordinal():返回枚举常量的序号
  • 自身方法(静态):

    • values():返回自身的常量数组
    • valueOf():由字符串转化为枚举

枚举在switch中的注意事项:

Sex sex = Sex.MAN;
switch (sex) {
    case MAN://注意这里,这里不能写Sex.MAN,而是用MAN
        System.out.println("man");
        break;
    case WOMAN:
        System.out.println("woman");
        break;
    default:
        System.out.println("error");
}

实际上使用枚举可以很方便的构建单例模式:详见这篇博文

标签: Java

添加新评论