`

Java enum的用法详解

    博客分类:
  • Java
阅读更多

Java中枚举实现的分析:

    示例: 

public static enum SEVERITY{
          INFO,WARN,ERROR
}

   enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法。我们对代码编译之后发现,编译器将enum类型单独编译成了一个字节码文件:SEVERITY.class。

 

   SEVERITY字节码代码

// Signature: Ljava/lang/Enum<LSEVERITY;>;
public final enum SEVERITY {
  
  // Field descriptor #6 LSEVERITY;
  public static final enum SEVERITY INFO;
  
  // Field descriptor #6 LSEVERITY;
  public static final enum SEVERITY WARN;
  
  // Field descriptor #6 LSEVERITY;
  public static final enum SEVERITY ERROR;
  
  // Field descriptor #10 [LSEVERITY;
  private static final synthetic SEVERITY[] ENUM$VALUES;
  
  // Method descriptor #12 ()V
  // Stack: 4, Locals: 0
  static {};
     0  new SEVERITY [1]
     3  dup
     4  ldc <String "INFO"> [14]
     6  iconst_0
     7  invokespecial SEVERITY(java.lang.String, int) [15]
    10  putstatic SEVERITY.INFO : SEVERITY [19]
    13  new SEVERITY [1]
    16  dup
    17  ldc <String "WARN"> [21]
    19  iconst_1
    20  invokespecial SEVERITY(java.lang.String, int) [15]
    23  putstatic SEVERITY.WARN : SEVERITY [22]
    26  new SEVERITY [1]
    29  dup
    30  ldc <String "ERROR"> [24]
    32  iconst_2
    33  invokespecial SEVERITY(java.lang.String, int) [15]
    36  putstatic SEVERITY.ERROR : SEVERITY [25]
    39  iconst_3
    40  anewarray SEVERITY [1]
    43  dup
    44  iconst_0
    45  getstatic SEVERITY.INFO : SEVERITY [19]
    48  aastore
    49  dup
    50  iconst_1
    51  getstatic SEVERITY.WARN : SEVERITY [22]
    54  aastore
    55  dup
    56  iconst_2
    57  getstatic SEVERITY.ERROR : SEVERITY [25]
    60  aastore
    61  putstatic SEVERITY.ENUM$VALUES : SEVERITY[] [27]
    64  return
      Line numbers:
        [pc: 0, line: 4]
        [pc: 39, line: 2]
  
  // Method descriptor #18 (Ljava/lang/String;I)V
  // Stack: 3, Locals: 3
  private SEVERITY(java.lang.String arg0, int arg1);
    0  aload_0 [this]
    1  aload_1 [arg0]
    2  iload_2 [arg1]
    3  invokespecial java.lang.Enum(java.lang.String, int) [31]
    6  return
      Line numbers:
        [pc: 0, line: 2]
      Local variable table:
        [pc: 0, pc: 7] local: this index: 0 type: SEVERITY
  
  // Method descriptor #34 ()[LSEVERITY;
  // Stack: 5, Locals: 3
  public static SEVERITY[] values();
     0  getstatic SEVERITY.ENUM$VALUES : SEVERITY[] [27]
     3  dup
     4  astore_0
     5  iconst_0
     6  aload_0
     7  arraylength
     8  dup
     9  istore_1
    10  anewarray SEVERITY [1]
    13  dup
    14  astore_2
    15  iconst_0
    16  iload_1
    17  invokestatic java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) : void [35]
    20  aload_2
    21  areturn
      Line numbers:
        [pc: 0, line: 1]
  
  // Method descriptor #42 (Ljava/lang/String;)LSEVERITY;
  // Stack: 2, Locals: 1
  public static SEVERITY valueOf(java.lang.String arg0);
     0  ldc <Class SEVERITY> [1]
     2  aload_0 [arg0]
     3  invokestatic java.lang.Enum.valueOf(java.lang.Class, java.lang.String) : java.lang.Enum [43]
     6  checkcast SEVERITY [1]
     9  areturn
      Line numbers:
        [pc: 0, line: 1]
}

   不难看出所有的枚举值都是类静态常量。

 

   下面介绍enum的定义及用法

    1、SEVERITY枚举类是一个class,而且是一个不可以被继承的final类。其枚举值(INFO,WARN,ERROR)都是SEVERITY类中静态常量, 我们可以通过下面的方式来得到SEVERITY枚举类的一个实例:

                                                         SEVERITY s = SEVERITY.INFO; 
    注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。

 

   2、因为枚举类是class,所以在枚举类型中有构造器,方法和数据域。但是枚举类的构造器有点不同:

 

public enum SEVERITY
{
    INFO("info"), WARN("warn"), ERROR("error");

    private SEVERITY(String code)
    {
        this.code = code;
    }

    public String toString()
    {
        return "(" + code + ")";
    }

    private String code;

    public String getCode()
    {
        return code;
    }

    public void setCode(String code)
    {
        this.code = code;
    }
}

    构造器只能私有(private),绝对不允许有public构造器。 这样可以保证外部代码无法新构造枚举类的实例。因为枚举值是public static final的常量。 但枚举类的方法和数据域可以允许外部访问。

 

    3、所有枚举类都继承了Enum的方法,下面介绍这些方法:

         (1)  ordinal()方法: 返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定。
                 SEVERITY.INFO.ordinal();  //返回结果:0

         (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较对象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。
                 SEVERITY.INFO.compareTo(SEVERITY.WARN);  //返回结果 -1

         (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。
                 SEVERITY[] s=SEVERITY.values();
         (4)  valueOf()方法: 返回带指定名称的指定枚举类型的枚举常量。
                 SEVERITY.valueOf("ERROR");   //返回结果: SEVERITY.ERROR

         (5)  equals()方法: 比较两个枚举类对象的引用。

 

    4、枚举类可以在switch语句中使用。

 

SEVERITY severity =SEVERITY.ERROR;  
switch(severity){  
        case INFO: System.out.println("it's info");break;  
        case WARN: System.out.println("it's warn");break;  
        case ERROR: System.out.println("it's error");break;  
}  

 

 

    5、实现接口

    所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

    public interface Behaviour {
        void print();

        String getInfo();
    }

    public enum Color implements Behaviour {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;

        // 构造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 接口方法

        @Override
        public String getInfo() {
            return this.name;
        }

        // 接口方法
        @Override
        public void print() {
            System.out.println(this.index + ":" + this.name);
        }
    }

   

    6、使用接口组织枚举

 

    public interface Food {
        enum Coffee implements Food {
            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
        }

        enum Dessert implements Food {
            FRUIT, CAKE, GELATO
        }
    }

 

    7、关于枚举集合的使用

    java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。

public class LightTest {

    // 1.定义枚举类型

    public enum Light {

        // 利用构造函数传参

        RED(1), GREEN(3), YELLOW(2);

        // 定义私有变量

        private int nCode;

        // 构造函数,枚举类型只能为私有

        private Light(int _nCode) {

            this.nCode = _nCode;

        }

        @Override
        public String toString() {

            return String.valueOf(this.nCode);

        }

    }

    /**
     * 
     * @param args
     */

    public static void main(String[] args) {

        // 1.遍历枚举类型

        System.out.println("演示枚举类型的遍历 ......");

        testTraversalEnum();

        // 2.演示EnumMap对象的使用

        System.out.println("演示EnmuMap对象的使用和遍历.....");

        testEnumMap();

        // 3.演示EnmuSet的使用

        System.out.println("演示EnmuSet对象的使用和遍历.....");

        testEnumSet();

    }

    /**
     * 
     * 演示枚举类型的遍历
     */

    private static void testTraversalEnum() {

        Light[] allLight = Light.values();

        for (Light aLight : allLight) {

            System.out.println("当前灯name:" + aLight.name());

            System.out.println("当前灯ordinal:" + aLight.ordinal());

            System.out.println("当前灯:" + aLight);

        }

    }

    /**
     * 
     * 演示EnumMap的使用,EnumMap跟HashMap的使用差不多,只不过key要是枚举类型
     */

    private static void testEnumMap() {

        // 1.演示定义EnumMap对象,EnumMap对象的构造函数需要参数传入,默认是key的类的类型

        EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(

        Light.class);

        currEnumMap.put(Light.RED, "红灯");

        currEnumMap.put(Light.GREEN, "绿灯");

        currEnumMap.put(Light.YELLOW, "黄灯");

        // 2.遍历对象

        for (Light aLight : Light.values()) {

            System.out.println("[key=" + aLight.name() + ",value="

            + currEnumMap.get(aLight) + "]");

        }

    }

    /**
     * 
     * 演示EnumSet如何使用,EnumSet是一个抽象类,获取一个类型的枚举类型内容<BR/>
     * 
     * 可以使用allOf方法
     */

    private static void testEnumSet() {

        EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);

        for (Light aLightSetElement : currEnumSet) {

            System.out.println("当前EnumSet中数据为:" + aLightSetElement);

        }

    }

}

 

   转载请注明出处:http://xieke90.iteye.com/blog/2224034

 

1
0
分享到:
评论

相关推荐

    Java enum的用法详解.docx

    下面我们将详细探讨Java enum的四种常见用法。 1. 定义常量: 在Java 1.5之前,我们通常使用`public static final`关键字来定义常量,但这种方式存在一些局限。枚举提供了一种将相关常量分组的方式,例如定义颜色:...

    java 中enum的使用方法详解

    下面我们将深入探讨enum的使用方法。 1. **定义枚举** 定义枚举的关键字是`enum`,例如: ```java public enum WeekDays { MON, TUE, WED, THU, FRI, SAT, SUN; } ``` 这里我们创建了一个名为`WeekDays`的...

    高阶Java-Java枚举类型 enum 应用详解

    在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...

    java的Enum

    ### Java的Enum知识点详解 #### 一、枚举的基本概念 在Java中,`enum`(枚举)是一种特殊的类,用于定义一组常量值。它可以帮助开发者限制一个变量的可能值,使其只能从预定义的一组选项中选择。枚举提供了一种更...

    java 枚举(enum) 详解(学习资料)

    Java 枚举(enum)是 Java 语言中的一个重要特性,自 Java 5 开始引入。枚举用于定义一组相关的常量,这些常量通常代表一个有限的、预定义的值集合。枚举类是一种特殊的类,它具有以下特点: 1. **枚举类的声明**:...

    java枚举类型enum的使用

    ### Java 枚举类型 enum 的使用详解 #### 一、枚举类型概述 在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来...

    Java(enum)枚举用法详解

    Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的常量表示机制。它不仅仅是一个简单的数据类型,而是一种特殊的类,能够帮助我们更好地管理和组织一组相关的常量。枚举类型使得代码更加清晰,易于理解和维护,...

    javaenum(枚举)使用详解+总结.pdf

    下面我们将深入探讨enum的使用方法、特性以及常见的操作。 1. **枚举定义** 创建枚举类型的语法非常简洁,只需使用`enum`关键字,如下所示: ```java public enum Color { RED, GREEN, BLUE } ``` 这里定义...

    详解Java的Enum的使用与分析

    Java的枚举(Enum)是Java语言中一种特殊的数据类型,用于表示一组固定数量的值。在Java中,枚举可以看作是一种预定义的类,具有类的特性,但比普通类更加强制和安全。以下是关于Java枚举的详细讲解: 1. **枚举的...

    Java枚举类型enum的详解及使用

    本文将对 Java 枚举类型 enum 进行详解,并介绍其使用方法。 一、枚举类型的定义 在 Java 中,枚举类型使用关键字 enum 定义。所有的枚举类型都是继承自 Enum 类型。枚举类型可以拥有自己的名字和顺序,每个枚举...

    Java中的Enum枚举用法.doc

    ### Java中的Enum枚举用法详解 #### 一、引言 在Java编程语言中,枚举(Enum)是一种特殊的数据类型,它被用来表示一组固定的常量集合。相比于使用常量接口或字符串来表示固定集合,枚举提供了更加安全且易于管理的...

    JAVA枚举类型的用法详解

    下面我们将深入探讨Java枚举类型的常见用法。 首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`...

    Java枚举(enum) 详解7种常见的用法

    Java中的枚举(enum)是自...总结来说,Java枚举提供了一种结构化、类型安全的方式来定义和使用常量,还支持方法定义、接口实现以及与`switch`语句的无缝集成。这些特性使得枚举成为编写可维护、可扩展代码的重要工具。

    java 中枚举类enum的values()方法的详解

    Java 中枚举类 enum 的 values() 方法详解 Java 中的枚举类 enum 是一种特殊的类,通过使用 enum 关键字来定义。枚举类 enum 中有一个特殊的方法,values(),这个方法可以将枚举类转换为一个枚举类型的数组。通过...

    Java enum的用法详细介绍及实例代码

    以下是对Java `enum`的详细用法和实例代码的深入解析。 **用法一:常量的定义和使用** 在Java 1.5之前,我们通常使用`public static final`关键字来定义常量。但自从引入`enum`后,我们可以将相关常量组织到一个...

    Java开发详解.zip

    031403_【第14章:枚举】_类集对Enum的支持笔记.pdf 031404_【第14章:枚举】_枚举的其他应用笔记.pdf 031501_【第15章:Java反射机制】_认识Class类笔记.pdf 031502_【第15章:Java反射机制】_Class类的使用笔记....

    Java枚举的使用方法详解

    Java枚举的使用方法详解 Java枚举的使用方法详解是指在Java语言中使用枚举类型来实现枚举的操作。枚举是一种特殊的数据类型,它可以用来定义一组named values,例如星期天、星期一、星期二等。在Java中,枚举可以...

Global site tag (gtag.js) - Google Analytics