zoukankan      html  css  js  c++  java
  • java enum(枚举)使用详解和总结(转)

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

        下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:

    1. 原始的接口定义常量

    2. 语法(定义)

    3. 遍历、switch 等常用操作

    4. enum 对象的常用方法介绍

    5. 给 enum 自定义属性和方法

    6. EnumSet,EnumMap 的应用

    7. enum 的原理分析

    8. 总结

    原始的接口定义常量

    1 public interface IConstants { 
    2     String MON = "Mon"; 
    3     String TUE = "Tue"; 
    4     String WED = "Wed"; 
    5     String THU = "Thu"; 
    6     String FRI = "Fri"; 
    7     String SAT = "Sat"; 
    8     String SUN = "Sun"; 
    9 }

    语法(定义)

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

    1 package com.hmw.test; 
    2 /** 
    3  * 枚举测试类 4  */
    4  public enum EnumTest { 
    5      MON, TUE, WED, THU, FRI, SAT, SUN; 
    6  } 
    1 new Enum<EnumTest>("MON",0); 
    2 new Enum<EnumTest>("TUE",1); 
    3 new Enum<EnumTest>("WED",2); 
    4     ... ...  

    遍历、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.TUE; 
    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 
    THU 
    FRI 
    SAT 
    SUN 
    ----------------我是分隔线------------------ 
    今天是星期二 
     

    enum 对象的常用方法介绍

    int compareTo(E o)
              比较此枚举与指定对象的顺序。

    Class<E> getDeclaringClass()
              返回与此枚举常量的枚举类型相对应的 Class 对象。

    String name()
              返回此枚举常量的名称,在其枚举声明中对其进行声明。

    int ordinal()
              返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

    String toString()

               返回枚举常量的名称,它包含在声明中。

    static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
              返回带指定名称的指定枚举类型的枚举常量。

     1 public class Test { 
     2     public static void main(String[] args) { 
     3         EnumTest test = EnumTest.TUE; 
     4           
     5         //compareTo(E o) 
     6         switch (test.compareTo(EnumTest.MON)) { 
     7         case -1: 
     8             System.out.println("TUE 在 MON 之前"); 
     9             break; 
    10         case 1: 
    11             System.out.println("TUE 在 MON 之后"); 
    12             break; 
    13         default: 
    14             System.out.println("TUE 与 MON 在同一位置"); 
    15             break; 
    16         } 
    17           
    18         //getDeclaringClass() 
    19         System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName()); 
    20           
    21         //name() 和  toString() 
    22         System.out.println("name(): " + test.name()); 
    23         System.out.println("toString(): " + test.toString()); 
    24           
    25         //ordinal(), 返回值是从 0 开始 
    26         System.out.println("ordinal(): " + test.ordinal()); 
    27     } 
    28 }
    输出结果: 
    TUE 在 MON 之后 
    getDeclaringClass(): com.hmw.test.EnumTest 
    name(): TUE 
    toString(): TUE 
    ordinal(): 1 

    给enum 自定义属性和方法

    给 enum 对象加一下 value 的属性和 getValue() 的方法:

     1 package Enum;
     2 
     3 public enum EnumTest
     4 {
     5     MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6),SUN(0);
     6 
     7     private int value;
     8 
     9     private EnumTest(int value)
    10     {
    11         this.value = value;
    12     }
    13 
    14     public int getValue()
    15     {
    16         return value;
    17     }
    18 
    19     public boolean isRest()
    20     {
    21         return false;
    22     }
    23 }
    1 package Enum;
    2 public class Test { 
    3      public static void main(String[] args) { 
    4          System.out.println("EnumTest.SUN 的 value = " + EnumTest.SUN.getValue()); 
    5      } 
    6  } 

    EnumSet,EnumMap 的应用

     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>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

     1 public class com.hmw.test.EnumTest extends java.lang.Enum{ 
     2     public static final com.hmw.test.EnumTest MON; 
     3     public static final com.hmw.test.EnumTest TUE; 
     4     public static final com.hmw.test.EnumTest WED; 
     5     public static final com.hmw.test.EnumTest THU; 
     6     public static final com.hmw.test.EnumTest FRI; 
     7     public static final com.hmw.test.EnumTest SAT; 
     8     public static final com.hmw.test.EnumTest SUN; 
     9     static {}; 
    10     public int getValue(); 
    11     public boolean isRest(); 
    12     public static com.hmw.test.EnumTest[] values(); 
    13     public static com.hmw.test.EnumTest valueOf(java.lang.String); 
    14     com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest); 
    15 }

    所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

    总结

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

    努力奋斗的小墨鱼 ---- http://www.cnblogs.com/WayneZeng/
  • 相关阅读:
    利用Flask中的werkzeug.security模块加密
    logging
    python后端架构(转)
    访问一个网页的全过程
    微服务优缺点
    HTTP协议通信原理 与常见报错信息
    SSH与ansible 部署方法与核心模块简介
    linux 普通用户批量创建账户与密码
    三次握手与4次挥手简单说明
    sed 命令简介
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/2695153.html
Copyright © 2011-2022 走看看