Java语言

来源:互联网 发布:社交网络的好处知乎 编辑:程序博客网 时间:2024/06/05 07:30

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