`

进java中了解枚举

阅读更多

 

上网查了一下,发现这篇文章讲的很好,学习学习!!!~~~~

枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就是一个典型枚举类型的定义:

Java代码 复制代码
  1. public enum Color{   
  2.     RED,BLUE,BLACK,YELLOW,GREEN   
  3. }  
public enum Color{
    RED,BLUE,BLACK,YELLOW,GREEN
}

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

Color字节码代码 复制代码
  1. final enum hr.test.Color {   
  2.      
  3.  // 所有的枚举值都是类静态常量   
  4.  public static final enum hr.test.Color RED;   
  5.  public static final enum hr.test.Color BLUE;   
  6.  public static final enum hr.test.Color BLACK;   
  7.  public static final enum hr.test.Color YELLOW;   
  8.  public static final enum hr.test.Color GREEN;   
  9.     
  10. private static final synthetic hr.test.Color[] ENUM$VALUES;   
  11.      
  12.   // 初始化过程,对枚举类的所有枚举值对象进行第一次初始化   
  13.  static {   
  14.        0  new hr.test.Color [1]    
  15.       3  dup   
  16.       4  ldc <String "RED"> [16] //把枚举值字符串"RED"压入操作数栈   
  17.       6  iconst_0  // 把整型值0压入操作数栈   
  18.       7  invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED   
  19.      10  putstatic hr.test.Color.RED : hr.test.Color [21]  //将枚举对象赋给Color的静态常量RED。   
  20.       .........  枚举对象BLUE等与上同   
  21.     102  return   
  22. };   
  23.      
  24.   // 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。   
  25.  private Color(java.lang.String arg0, int arg1){   
  26.      // 调用父类Enum的受保护构造器创建一个枚举对象   
  27.      3  invokespecial java.lang.Enum(java.lang.String, int) [38]   
  28. };   
  29.     
  30.  public static hr.test.Color[] values();   
  31.      
  32.    // 实现Enum类的抽象方法     
  33.   public static hr.test.Color valueOf(java.lang.String arg0);   
  34. }  
final enum hr.test.Color {
  
 // 所有的枚举值都是类静态常量
 public static final enum hr.test.Color RED;
 public static final enum hr.test.Color BLUE;
 public static final enum hr.test.Color BLACK;
 public static final enum hr.test.Color YELLOW;
 public static final enum hr.test.Color GREEN;
 
private static final synthetic hr.test.Color[] ENUM$VALUES;
  
  // 初始化过程,对枚举类的所有枚举值对象进行第一次初始化
 static {
       0  new hr.test.Color [1] 
      3  dup
      4  ldc <String "RED"> [16] //把枚举值字符串"RED"压入操作数栈
      6  iconst_0  // 把整型值0压入操作数栈
      7  invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED
     10  putstatic hr.test.Color.RED : hr.test.Color [21]  //将枚举对象赋给Color的静态常量RED。
      .........  枚举对象BLUE等与上同
    102  return
};
  
  // 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。
 private Color(java.lang.String arg0, int arg1){
     // 调用父类Enum的受保护构造器创建一个枚举对象
     3  invokespecial java.lang.Enum(java.lang.String, int) [38]
};
 
 public static hr.test.Color[] values();
  
   // 实现Enum类的抽象方法  
  public static hr.test.Color valueOf(java.lang.String arg0);
}
 

下面我们就详细介绍enum定义的枚举类的特征及其用法。(后面均用Color举例)

1、Color枚举类就是class,而且是一个不可以被继承的final类。其枚举值(RED,BLUE...)都是Color类型的类静态常量, 我们可以通过下面的方式来得到Color枚举类的一个实例:
                                                         Color c=Color.RED;
注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。

2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同:
      (1) 构造器只是在构造枚举值的时候被调用。

Java代码 复制代码
  1. enum Color{   
  2.                 RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);   
  3.                 //构造枚举值,比如RED(255,0,0)   
  4.                 private Color(int rv,int gv,int bv){   
  5.                  this.redValue=rv;   
  6.                  this.greenValue=gv;   
  7.                  this.blueValue=bv;   
  8.                 }   
  9.   
  10.                 public String toString(){  //覆盖了父类Enum的toString()   
  11.                 return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";   
  12.                 }   
  13.       
  14.                 private int redValue;  //自定义数据域,private为了封装。   
  15.                 private int greenValue;   
  16.                 private int blueValue;   
  17.  }  
enum Color{
                RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
                //构造枚举值,比如RED(255,0,0)
                private Color(int rv,int gv,int bv){
                 this.redValue=rv;
                 this.greenValue=gv;
                 this.blueValue=bv;
                }

                public String toString(){  //覆盖了父类Enum的toString()
                return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";
                }
   
                private int redValue;  //自定义数据域,private为了封装。
                private int greenValue;
                private int blueValue;
 }

      (2) 构造器只能私有private,绝对不允许有public构造器。 这样可以保证外部代码无法新构造枚举类的实例。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 但枚举类的方法和数据域可以允许外部访问。

Java代码 复制代码
  1. public static void main(String args[])   
  2. {   
  3.         // Color colors=new Color(100,200,300);  //wrong   
  4.            Color color=Color.RED;   
  5.            System.out.println(color);  // 调用了toString()方法   
  6. }     
public static void main(String args[])
{
        // Color colors=new Color(100,200,300);  //wrong
           Color color=Color.RED;
           System.out.println(color);  // 调用了toString()方法
}   
 

3、所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。
       (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
                 Color.RED.ordinal();  //返回结果:0
                 Color.BLUE.ordinal();  //返回结果:1
       (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
                 Color.RED.compareTo(Color.BLUE);  //返回结果 -1
       (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。
                 Color[] colors=Color.values();
                 for(Color c:colors){
                        System.out.print(c+",");
                 }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
       (4)  toString()方法: 返回枚举常量的名称。
                 Color c=Color.RED;
                 System.out.println(c);//返回结果: RED
       (5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
                 Color.valueOf("BLUE");   //返回结果: Color.BLUE
       (6)  equals()方法: 比较两个枚举类对象的引用。

Java代码 复制代码
  1. //JDK源代码:       
  2. public final boolean equals(Object other) {   
  3.         return this==other;   
  4. }               
//JDK源代码:    
public final boolean equals(Object other) {
        return this==other;
}             


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

Java代码 复制代码
  1. Color color=Color.RED;   
  2. switch(color){   
  3.         case RED: System.out.println("it's red");break;   
  4.         case BLUE: System.out.println("it's blue");break;   
  5.         case BLACK: System.out.println("it's blue");break;   
  6. }  
分享到:
评论

相关推荐

    java枚举类用法

    通过上述介绍,我们了解到Java枚举类的多种用法,包括声明、初始化、方法定义、构造器、转换为集合、遍历、比较、在switch语句中的应用以及序列化等。枚举类不仅提高了代码的可读性和安全性,还简化了常量管理,使得...

    JAVA中的枚举类型1:基本用法.doc

    ### JAVA中的枚举类型1:基本用法 #### 一、枚举类型的引入与定义 在Java 5中,枚举类型作为一种新特性被引入,主要用于定义一组固定的、相关的常量集合。通过枚举类型,我们可以更加清晰地组织并限制程序中可用的...

    谈谈你可能并不了解的java枚举

    虽然初学者通常只接触基础用法,但深入了解枚举的内在机制和高级特性可以提升代码的质量和可维护性。本文将深入探讨Java枚举的一些鲜为人知的特性。 1. 枚举默认值与自定义值: Java枚举的默认值是从0开始的整数...

    mybatis入门实战之枚举类型

    首先,我们要明白枚举(Enum)在Java中的作用。枚举是一种特殊的类,用于定义一组相关的常量,这些常量通常代表某种特定的分类或状态。在MyBatis中,枚举可以用于表示数据库字段的值,如性别、状态等。这样不仅增强...

    java枚举的一个例子

    使用枚举可以提高代码的可读性和可维护性,并且Java中的枚举还支持许多高级特性。 #### 枚举的基础用法 通过提供的代码片段,我们可以看到一个简单的枚举定义示例。在这个例子中,枚举名为`EnumTest`,它定义了四...

    Java 枚举类型案例.zip

    通过实践上述案例,你可以深入了解Java枚举的特性,并在实际项目中灵活运用。枚举不仅提高了代码的可读性,也减少了因硬编码常量导致的错误。学习并熟练掌握枚举类型,将对提升Java编程能力大有裨益。

    Java枚举数据类型.pdf

    在Java编程语言的发展历程中,枚举数据类型的引入是其中一个重要的里程碑。在Java 1.5版本之前,Java语言没有内置的枚举类型,开发者们常常使用int枚举模式或者String枚举模式来模拟枚举的行为。这些模拟方法虽然在...

    枚举java基础知识点

    枚举Java基础知识点 Java中的枚举(Enumeration)是一种特殊的数据类型,它可以将一组固定的常量分组到一个枚举类型中,使得代码更加简洁、易读和维护。...了解枚举的用法是Java编程的基础知识点。

    Java枚举数据类型.doc

    - **类型安全**:枚举确保了只能使用枚举中定义的值,避免了非法值的传递。 - **可读性**:枚举值通常使用有意义的标识符,提高了代码的可读性。 - **接口实现**:枚举可以实现一个或多个接口,扩展其功能。 - *...

    java-enum-mimetype:MIME 类型的 Java 枚举类

    在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组固定的常量。MIME类型(Multipurpose Internet Mail Extensions)是互联网上用来表示数据类型的标识,它用于指定文件的格式,比如文本、图像、音频、...

    Java枚举类型在switch语句正确使用方法详解

    首先,需要了解 Java 枚举类型的基本概念。Java 枚举类型是一种特殊类型,它可以定义一组具有一些公共特征的常量。枚举类型可以用于定义一些固定的常量,如星期几、月份、颜色等。枚举类型的优势在于可以使代码更加...

    Java编程基础教程:枚举与泛型的深入讲解

    内容概要:本文深入介绍了Java中的两个重要特性——枚举和泛型。首先详细讲述了枚举的基本概念、枚举类型的特点及其实现方式,如枚举的成员方法、构造器以及如何将其用于高级编程场合。其次对泛型的概念进行了解释,...

    JAVA枚举与设计模式PPT教案学习.pptx

    1.7节展示了一个实用的静态方法`random()`,用于从枚举中随机选择一个元素,这在某些情况下可以用于测试或生成随机行为。 随后,PPT提到了枚举在设计模式中的应用,特别是在1.7页中提及的枚举和单例模式的结合。 ...

    Java API文档 中文网页版

    Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、方法和常量的详细说明。这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,...

    【Java基础笔记】枚举和注解.docx

    `enum`定义的类自动继承`java.lang.Enum`,并且可以直接在枚举中声明实例,如`Season`类。 2. **常用方法**: - `values()`:返回枚举类的所有实例组成的数组,方便遍历。 - `valueOf(String name)`:通过枚举...

    java 课件 数组、枚举及注解

    了解并熟练运用数组、枚举和注解是提升Java编程能力的关键,它们在软件开发中扮演着不可或缺的角色,尤其是在构建复杂系统时。通过掌握这些基础知识,开发者能够更好地组织代码,提高可读性和可维护性。

    Java工作笔记-枚举类型反射

    例如,在示例代码中,`emCLass.getEnumConstants()`将返回`Em`枚举中的`ONE_EM`, `TWO_EM`, `THREE_EM`这三个常量对象。 2. **获取枚举方法**:和普通类一样,我们可以通过`Class`对象的`getMethod()`方法获取枚举...

    java8 中文文档

    通过这份中文文档,学习者可以深入了解这些特性,并在实践中熟练掌握。对于初学者来说,学会阅读官方文档是非常重要的,这将有助于理解和解决实际开发中的问题。而这份文档的翻译质量相对不错,是学习和查阅 Java 8 ...

    JAVA中的数据字典

    3. **枚举类型(Enum)**:在Java中,枚举是一种强大的工具,可用于定义一组固定的值,这些值可以作为数据字典中的条目。枚举类型提供了一种安全且易于管理的方式来表示有限的数据集。 4. **注释和文档生成**:为了...

    Java中对于双属性枚举的使用案例

    在这个枚举中,`MAPPING`, `QUOTE`, `ENTRUST`, 和 `AGENT` 是四个枚举常量,每个都拥有一个整数值(`value`)和一个描述文本(`desc`)。枚举构造函数用于初始化这些属性,而`getValue()`和`getDesc()`方法则用于...

Global site tag (gtag.js) - Google Analytics