Java枚举

什么是枚举

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


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  

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: