枚举类(enum)

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

  1. 在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类;
  2. 在 Java 中使用 enum 关键字来定义枚举类,其地位与 class、interface 相同;
  3. 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器 (只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用)
  4. 一个 Java 源文件中最多只能有一个 public 类型的枚举类,且该 Java 源文件的名字也必须和该枚举类的类名相同,这点和类是相同的;
  5. 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口;
  6. 所有的枚举值都是 public static final 的,且非抽象的枚举类不能再派生子类
  7. 枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。

枚举类的使用

定义枚举类

Java中使用enum关键字定义一个枚举类。enum和class地位相同。

  1. // 定义一个星期的枚举类
  2. public enum DayEnum {
  3. // 在第一行显式地列出7个枚举实例(枚举值),系统会自动添加 public static final 修饰
  4. MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SUNDAY, SATURDAY;
  5. }

枚举类的成员变量、成员方法、构造器

  1. public enum DayEnum {
  2. //星期一
  3. MONDAY("星期一"),
  4. //星期二
  5. TUESDAY("星期二"),
  6. //星期三
  7. WEDNESDAY("星期三"),
  8. //星期四
  9. THURSDAY("星期四"),
  10. //星期五
  11. FRIDAY("星期五"),
  12. //星期天
  13. SUNDAY("星期天"),
  14. //星期六
  15. SATURDAY("星期六");
  16. private String date;
  17. DayEnum(String data){
  18. this.date = data;
  19. }
  20. public String getDate() {
  21. return date;
  22. }
  23. public void setDate(String date) {
  24. this.date = date;
  25. }
  26. }

枚举类中的常用方法

**

  1. //该方法用于与制定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例比较。
  2. //如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回零;
  3. int compareTo(E o);
  4. //返回此枚举实例的名称,即枚举值
  5. String name();
  6. //返回一个包含全部枚举值的数组,可以用来遍历所有枚举值
  7. static values();
  8. //返回枚举值在枚举类中的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定;
  9. int ordinal();
  10. //返回带指定名称的指定枚举类型的枚举常量,
  11. //名称必须与在此类型中声明枚举常量所用的标识符完全匹配(不允许使用额外的空白字符)。
  12. //这个方法与toString相对应,因此重写 toString() 方法,一定要重写 valueOf() 方法
  13. //(我们可以重写 toString() 方法,但不能自己重写 valueOf() 方法,当我们重写 toString() 方法时,
  14. //valueOf() 方法会自动重写,不用我们理会。);
  15. static <T extends Enum<T>> T valueOf(Class<T> enumType, String name);
  16. //返回与此枚举常量的枚举类型相对应的 Class 对象
  17. Class<E> getDeclaringClass();

枚举类实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。但是枚举类可以实现接口,同时也要实现该接口的所有方法。

  1. public enum DayEnum implements Serializable {
  2. //星期一
  3. MONDAY("星期一"),
  4. //星期二
  5. TUESDAY("星期二"),
  6. //星期三
  7. WEDNESDAY("星期三"),
  8. //星期四
  9. THURSDAY("星期四"),
  10. //星期五
  11. FRIDAY("星期五"),
  12. //星期天
  13. SUNDAY("星期天"),
  14. //星期六
  15. SATURDAY("星期六");
  16. //....
  17. }

枚举类定义抽象方法

枚举类里也可以定义抽象方法,但是枚举实例需要实现方法的实现

  1. public enum DayEnum{
  2. //星期一
  3. MONDAY("星期一"){
  4. @Override
  5. public int get() {
  6. return 1;
  7. }
  8. },
  9. //星期二
  10. TUESDAY("星期二"){
  11. @Override
  12. public int get() {
  13. return 2;
  14. }
  15. },
  16. //星期三
  17. WEDNESDAY("星期三"){
  18. @Override
  19. public int get() {
  20. return 2;
  21. }
  22. },
  23. //星期四
  24. THURSDAY("星期四"){
  25. @Override
  26. public int get() {
  27. return 4;
  28. }
  29. },
  30. //星期五
  31. FRIDAY("星期五"){
  32. @Override
  33. public int get() {
  34. return 5;
  35. }
  36. },
  37. //星期天
  38. SUNDAY("星期天"){
  39. @Override
  40. public int get() {
  41. return 7;
  42. }
  43. },
  44. //星期六
  45. SATURDAY("星期六"){
  46. @Override
  47. public int get() {
  48. return 6;
  49. }
  50. };
  51. private String date;
  52. DayEnum(String data){
  53. this.date = data;
  54. }
  55. //定义了一个抽象方法
  56. public abstract int get();
  57. }

小知识: 枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。