1 enum概述

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。

  1. enum Season {
  2. SPRING(1, "春"),
  3. SUMMER(2, "夏"),
  4. AUTUMN(3, "秋"),
  5. WINTER(4, "冬");
  6. private Integer val;
  7. private String value;
  8. Season(Integer val, String value) {
  9. this.val = val;
  10. this.value = value;
  11. }
  12. public Integer getVal() {
  13. return val;
  14. }
  15. public void setVal(Integer val) {
  16. this.val = val;
  17. }
  18. public String getValue() {
  19. return value;
  20. }
  21. public void setValue(String value) {
  22. this.value = value;
  23. }
  24. /**
  25. * 根据val获取枚举对象
  26. *
  27. * @param value
  28. * @return
  29. */
  30. public static Season getEnum(Integer val) {
  31. for (Season item : Season.values()) {
  32. if (item.getVal().equals(val)) {
  33. return item;
  34. }
  35. }
  36. return null;
  37. }
  38. /**
  39. *根据value获取枚举对象
  40. */
  41. public static Season getEnumByName(String value) {
  42. for (Season item : Season.values()) {
  43. if (item.getValue().equals(value)) {
  44. return item;
  45. }
  46. }
  47. return null;
  48. }
  49. }

2 enum实现原理

具体,我们对Season类进行反编译
进入dos: windows+r cmd
指定目录:cd /d E:\demo\out\production\myProject\enumDemo
通过javap命令对字节码进行反汇编:javap -c -l Season.class

  1. final class enumDemo.Season extends java.lang.Enum<enumDemo.Season> {
  2. public static final enumDemo.Season SPRING;
  3. public static final enumDemo.Season SUMMER;
  4. public static final enumDemo.Season AUTUMN;
  5. public static final enumDemo.Season WINTER;
  6. public static enumDemo.Season[] values();
  7. public static enumDemo.Season valueOf(java.lang.String);
  8. public java.lang.Integer getVal();
  9. public void setVal(java.lang.Integer);
  10. public java.lang.String getValue();
  11. public void setValue(java.lang.String);
  12. public static enumDemo.Season getEnum(java.lang.Integer);
  13. public static enumDemo.Season getEnumByName(java.lang.String);
  14. static {};
  15. }

我们看到,对与枚举类,有很多值的注意的点:

  • 枚举类在经过编译后确实是生成了一个扩展了java.lang.Enum的类
  • 枚举类是final的,因此我们无法再继承它了
  • 我们定义的每个枚举值都是该类中的一个成员,且成员的类型仍然是Season类型
  • 枚举类中被默认增加了许多静态方法,例如values()等