什么是枚举

枚举是一个“数据集”,这个数据集中的数值是稳定,并且有限的。
比如,“四季”这个数据集中,有四个元素---春、夏、秋、冬。
“星期”这个数据集中,有七个元素---“星期一”至“星期日”。


Java中的枚举

Java中的枚举可以被看成是一个普通的类。因此,它可以拥有实例成员变量、静态成员变量、实例成员方法、静态成员方法。相较于类,枚举特殊的地方包括:


例子

test.java:

enum ColorEnum {
    red, green, blue;
}

enum SeasonEnum {
    // 枚举值写在最前面否则编译报错
    spring, summer, autumn, winter;

    // 枚举可以像普通的类一样拥有实例成员方法
    // 实例成员方法必须通过枚举值调用
    // 静态成员方法可以通过枚举直接调用
    public String getMonthRange() {
        switch (this) {
            case spring:
                return "3-4-5";
            case summer:
                return "6-7-8";
            case autumn:
                return "9-10-11";
            default:
                return "12-1-2";
        }
    }
}

// 带有构造器的枚举
enum SexEnum {
    // unkown会调用无参的构造器
    male("male"), female("female"), unkown;

    private String sex;
    // 枚举的构造器必须是私有的
    SexEnum() {
        this.sex = "unkown";
    }

    SexEnum(String sex) {
        this.sex = sex;
    }

    public String getSex() {
        return sex;
    }
}

// 带有抽象方法的枚举
enum SexEnum2 {
    // male是花括号中定义的匿名内部类的对象
    // 该匿名内部类继承自枚举,必须重写枚举中定义的所有抽象方法
    male {public String getSex(){return "男性";}},
    female {public String getSex(){return "女性";}},
    unkown {public String getSex(){return "未知";}};

    public abstract String getSex();
}


public class test {
    public static void main(String[] args) throws Exception {
        // 枚举是一种创建型的数据结构,可以创建枚举类型的变量。
        // + 通过枚举,可以限制变量的取值范围。
        ColorEnum color = ColorEnum.red;

        // 使用枚举的valueOf方法可以将字符串转换成枚举值
        ColorEnum red = ColorEnum.valueOf("red");
        System.out.println(red == color); // true

        // 使用枚举值的toString方法可以将枚举值转换成字符串
        System.out.println("red".equals(red.toString())); // true

        // 遍历枚举
        for (ColorEnum colorEnum: ColorEnum.values())
            System.out.println(colorEnum);
        // 获取枚举中,枚举值的个数
        System.out.println(ColorEnum.values().length); // 3
        // 获取枚举值在枚举中的索引,索引默认从0开始
        System.out.println(red.ordinal()); // 0
        // 枚举实现了java.lang.Comparable接口
        System.out.println(red.compareTo(ColorEnum.green)); // -1

        // 调用枚举的实例成员方法
        System.out.println(SeasonEnum.autumn.getMonthRange()); // 9-10-11
        System.out.println(SexEnum.female.getSex()); // female

        System.out.println(SexEnum2.male.getSex()); // 男性
    }
}

编译:

[root@iZ23dastruaZ t]# javac test.java 
[root@iZ23dastruaZ t]# ls
ColorEnum.class     SeasonEnum.class  SexEnum2$2.class  SexEnum2.class  test.class
SeasonEnum$1.class  SexEnum2$1.class  SexEnum2$3.class  SexEnum.class   test.java