你的位置:首页 > Java教程

[Java教程]java enum的用法


原始的常量定义:

  

1 public static fianl MON=“Mon”;2 public static final TUE="Tue";

语法(定义)

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

1 public enum EnumTest {2   MON, TUE, WED, THU, FRI, SAT, SUN;3 }

这段代码实际上调用了7次 Enum(String name, int ordinal):

new Enum<EnumTest("MON",0);new Enum<EnumTest("TUE",1);new Enum<EnumTest("WED",2);......

遍历、switch 等常用操作

  对enum进行遍历和switch的操作示例代码:

 1 public class Test { 2   public static void main(String[] args) { 3     for (EnumTest e : EnumTest.values()) { 4       System.out.println(e.toString()); 5     } 6      7     System.out.println("----------------我是分隔线------------------"); 8      9     EnumTest test = EnumTest.THU;10     switch (test) {11     case MON:12       System.out.println("今天是星期一");13       break;14     case TUE:15       System.out.println("今天是星期二");16       break;17     // ... ...18     default:19       System.out.println(test);20       break;21     }22   }23 }
输出结果:
    MON
    TUE
    WED
    ...
    ------------我是分割线--------------
    今天是星期四
 
 


 

enum 自定义属性和方法

 1 public enum EnumTest{ 2 2     MON("星期一", 1), TUE("星期二", 2), WED("星期三", 3), THU("星期四", 4); 3 3     // 成员变量 4 4     private String name; 5 5     private int index; 6 6  7 7     // 构造方法 8 8     private EnumTest(String name, int index) { 9 9       this.name = name;10 10       this.index = index;11 11     }12       // 覆盖方法13       @Override14       public String toString() {15         return this.index + "_" + this.name;16       }17 12       18 13     // 普通方法19 14     public static String getName(int index) {20 15       for (EnumTest e : EnumTest.values()) {21 16         if (e.getIndex() == index) {22 17           return e.name;23 18         }24 19       }25 20       return null;26 21     }27 22 28 23     // get set 方法29 24     public String getName() {30 25       return name;31 26     }32 27 33 28     public void setName(String name) {34 29       this.name = name;35 30     }36 31 37 32     public int getIndex() {38 33       return index;39 34     }40 35 41 36     public void setIndex(int index) {42 37       this.index = index;43 38     }44 39   }  

 1 public class Test { 2   public static void main(String[] args) { 3     // EnumSet的使用 4     EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class); 5     for (EnumTest day : weekSet) { 6       System.out.println(day); 7     } 8  9     // EnumMap的使用10     EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);11     weekMap.put(EnumTest.MON, "星期一");12     weekMap.put(EnumTest.TUE, "星期二");13     // ... ...14     for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {15       Entry<EnumTest, String> entry = iter.next();16       System.out.println(entry.getKey().name() + ":" + entry.getValue());17     }18   }19 }

原理分析

        enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结

    可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。