Java语言 - 枚举类型(enum)

Java 5增加了一个新的类称作枚举类型(enum type),由一组固定的常量组成合法值的类型,每个常量是这个枚举类型的实例。
例如:

public enum Size {
    SMALL,MEDIUM,LARGE, EXTRA_LARGE
}

所有的枚举类型都是Enum类的子类,继承这个类的所有方法。
最常用的是toString()方法,返回枚举常量名。如:
Size.SMALL.toString()返回字符串”SMALL”。

Java的枚举类型的常量本质上是int值,所以两个枚举类型的值的比较,可以直接使用==。

Java的枚举类型的常量不能有修饰符,本质上是public static final。

在没有引入枚举类型之前,通常用一组int常量, 每个成员是一个常量,这种方法称作int枚举模式
例如:用数值表示人的血型类型码。

public class Person {
    public static final int O = 0;
    public static final int A = 1;
    public static final int B = 2;
    public static final int C = 3;
    private int boodGroup;

    public Person(int boodGroup) {
        this.boodGroup = boodGroup;
    }
    public int getBoodGroup() {
        return boodGroup;
    }
    public void setBoodGroup(int boodGroup) {
        this.boodGroup = boodGroup;
    }
    public static void main(String[] args) {
        Person thisPerson = new Person(4);//无效的类型值,但是没有语法错误。
    }   
}

这种方式存在诸多不足:

  • 类型安全性问题,如果构造Person对象,传入其他int值,编译器不报错;
  • 没有提供命名空间,如果有两组int枚举组具有相同的命名常量,只能加前缀防止名称冲突;
  • int枚举是编译时常量,被编译到使用它们的客户端中,如果int值发生变化,客户端必须重新编译;
  • int是个数值,没有符号名,降低了代码的可读性。

为了解决以上问题,可以用类取代类型码。

public class BoodGroup {
    public static final BoodGroup O = new BoodGroup(0);
    public static final BoodGroup A = new BoodGroup(1);
    public static final BoodGroup B = new BoodGroup(2);
    public static final BoodGroup AB = new BoodGroup(3);
    private static final BoodGroup[] values = {O, A, B, AB}; 

    private final int code;
    private BoodGroup(int code) {
        this.code = code;
    }
    public int getCode() {
        return code;
    }
    public static BoodGroup code(int arg) {
        return values[arg];
    }
}
public class Person2 {
    private BoodGroup boodGroup;
    public Person2(BoodGroup boodGroup) {
        this.boodGroup = boodGroup;
    }
    public BoodGroup getBoodGroup() {
        return boodGroup;
    }
    public void setBoodGroup(BoodGroup boodGroup) {
        this.boodGroup = boodGroup;
    }
    public int getBoodGroupCode() {
        return boodGroup.getCode();
    }
    public static void main(String[] args) {
        Person2 thisPerson = new Person2(BoodGroup.A);
        thisPerson.getBoodGroupCode();
    }   
}

如果用枚举类型,上面的代码将更加简洁:

public enum BoodGroupEnum {
    O(0),A(1),B(2),AB(3);
    private final int code;
    private BoodGroupEnum(int code) {
        this.code = code;
    }
    public int getCode() {
        return code;
    }
}
public class Person3 {
    private BoodGroupEnum boodGroup;
    public Person3(BoodGroupEnum boodGroup) {
        this.boodGroup = boodGroup;
    }
    public BoodGroupEnum getBoodGroup() {
        return boodGroup;
    }
    public void setBoodGroup(BoodGroupEnum boodGroup) {
        this.boodGroup = boodGroup;
    }
    public int getBoodGroupCode() {
        return boodGroup.getCode();
    }

    public static void main(String[] args) {
        Person3 thisPerson = new Person3(BoodGroupEnum.A);
        thisPerson.getBoodGroupCode();

        for (int i = 0; i < BoodGroupEnum.values().length; i++) {
            System.out.println(BoodGroupEnum.values()[i]);//打印出所有枚举常量字符串名字 O A B AB 
        }   

        EnumSet<BoodGroupEnum> set = EnumSet.allOf(BoodGroupEnum.class);
        set.forEach((x)->System.out.print(x + " "));//打印出所有枚举常量字符串名字 O A B AB   
    }
}

枚举类型优点总结:

  • 编译时的安全检查;
  • 有自己的命名空间;
  • 添加枚举常量,客户端代码不需要重新编译;
  • 提供访问方法;
  • 可以添加构造器,域和方法,可以实现接口;
  • 枚举类型提供了所有Object方法的高级实现,实现了Comparable, Serializable接口;
  • 如果枚举具有普遍适用性,可以定义成一个顶层类;否则可以定义成一个成员类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值