zoukankan      html  css  js  c++  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            @Override
    14             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是单一继承)。

  • 相关阅读:
    dispatchEvent 的应用
    sql语句中日期时间格式化查询
    Dotfuscator Professional Edition 4.9.7500.9484 混淆工具破解版+使用教程
    多表链接 Left join
    多线程计时器
    C#数据库事务原理及实践
    用户sa 登录失败。原因: 该帐户的密码必须更改 sql2008
    Application.DoEvents()和多线程
    C#中DataSet和DataReader的区别
    ROW_NUMBER() OVER函数的基本用法
  • 原文地址:https://www.cnblogs.com/guiqiu-Li/p/5853092.html
Copyright © 2011-2022 走看看