`

熟练掌握JDK1.5枚举类型

SUN 
阅读更多
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
  1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
  2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
  3.Enum默认实s现了java.lang.Comparable接口。
  4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
  5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
  6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。 
  7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
  了解了这些基本特性,我们来看看如何使用它们。
  1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
    for (Color c: Color.values())
      System.out.println(“find value:” + c);
  2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
  
public enum Color {
    Red,
    Green,
    Blue;  
    
    /*
     *定义一个变量表示枚举值的数目。
     *(我有点奇怪为什么sun没有给enum直接提供一个size方法).
     */
    private static int number = Color.values().length ;
    
    /**
     * 随机返回一个枚举值
     @return a random enum value.  
     */
    public static Color getRandomColor(){
      long random = System.currentTimeMillis() % number;
      switch ((int) random){
        case 0:
          return Color.Red;
        case 1:
          return Color.Green;
        case 2:
          return Color.Blue;
        default : return Color.Red;
      } 
    }
  }

  
  可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
  
  3.覆载(Override)toString, valueOf方法
  前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
  ….
  
public String toString(){    
      switch (this){
        case Red:
          return "Color.Red";
        case Green:
          return "Color.Green";
        case Blue:
          return "Color.Blue";
        default:
          return "Unknow Color";
              
      }
  }
  ….
  这时我们可以看到,此时再用前面的遍历代码打印出来的是
  Color.Red
  Color.Green
  Color.Blue
  而不是
  Red
  Green
  Blue.
  可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。
  
  4.使用构造函数
  虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。
  
  
public enum Color {
    Red("This is Red"),
    Green("This is Green"),
    Blue("This is Blue");  
    
    private String desc;
    
  Color(String desc){
      this.desc = desc;
    }
  
    public String getDesc(){
      return this.desc;
    }
  
   }

  这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
  要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
  
  5.实现特定的接口
  我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
  
  6.定义枚举值自己的方法
  前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
  
public enum Color {
    Red {  
      public String toString(){
        return "Color.Red";
      }
    },
    Green {
      public String toString(){
        return "Color.Green";
      }
    },
    Blue{
      public String toString(){
        return "Color.Blue";
      }
  
    };  
  }
  从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
  
  总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
分享到:
评论

相关推荐

    JDK1.5 API完整版

    了解并熟练掌握JDK 1.5 API对于Java开发者来说至关重要,它不仅提供了更高效、更安全的编程模式,也为后续的Java版本奠定了基础。通过深入学习和实践,开发者可以充分利用这些特性,提高代码质量和维护性。

    jdk1.5并发新特性.

    `TimeUnit` 是一个枚举类型,定义了不同时间单位,如 `DAYS`, `HOURS`, `MICROSECONDS`, `MILLISECONDS`, `MINUTES`, `NANOSECONDS`, 和 `SECONDS`。这个枚举提供了一些方便的方法,用于在不同的时间单位之间进行...

    JDK1.5版本

    JDK1.5增加了枚举类型的定义,使得枚举常量有了更正式的地位。枚举类型提供了一种创建有限集合的新方式,增强了代码的可读性和安全性。 4. **变量初始化块(Static Initializer Blocks)** 在JDK1.5中,可以使用...

    JDK1.5新特性

    JDK 1.5引入了枚举类型,结束了对常量集合的硬编码管理。枚举是一种特殊的类,用于定义一组相关的值。枚举可以拥有方法和字段,支持比较操作,并且可以与switch语句一起使用,提高了代码的清晰度和安全性。 3. **...

    jdk1.5.0.08 wini586

    JDK 1.5引入的枚举类型是面向对象的,可以看作是一组预定义的常量。枚举提高了代码的健壮性,因为它们不能被实例化或改变,防止了硬编码的常量值,同时也方便进行类型安全的操作,如switch语句中的枚举常量。 5. *...

    JDK1.5-1.6-1.7之新特性总结-1

    在Java的发展历程中,JDK 1.5到1.7版本引入了许多重要的新特性,极大地提升了开发效率和代码质量。下面将详细讲解这些版本中的关键特性。...学习并熟练掌握这些特性,对于成为一名优秀的Java开发者至关重要。

    jdk1.5u22-windows|jdk-5u22-windows-i586.zip

    **正文** JDK,全称为Java Development Kit,是Oracle公司提供的用于开发和运行Java应用程序的必备工具包。在本案例中,我们关注的是"jdk1.5u22-windows",这代表...了解并熟练掌握这些特性是每个Java开发者的基本功。

    SMART系统-系统框架设计与开发SQL Server 2000 + Eclipse3.1.2 + JDK1.5

    2. Java编程:掌握JDK 1.5的新特性,如泛型、枚举和注解,以及基本的面向对象编程概念,如类、接口、继承和多态。 3. JSP和Servlet:理解JSP的页面结构和脚本元素,以及Servlet的生命周期和如何处理HTTP请求。 4. ...

    jdk5.0新特性实例讲解

    在这个实例讲解中,我们将深入探讨三个关键的新特性:枚举类型、泛型和新特性概述。 首先,我们来关注Java枚举(Enum)。在JDK 1.5之前,我们通常使用整数常量或字符串常量来表示一组预定义的值,这种方式存在维护...

    javaJDK

    在探讨“javaJDK”这一主题时,我们深入解析Java Development Kit(JDK),这是Java编程语言的...无论是初学者还是经验丰富的开发者,都需要熟练掌握JDK的使用,才能在Java的世界里游刃有余,构建出高质量的软件产品。

    Json-lib-2.4.jdk15.jar

    4. **支持多种数据类型**:Json-lib不仅支持基本的Java数据类型,还支持自定义类、枚举类型、集合、Map等复杂数据结构的转换。 5. **便捷的API**:Json-lib提供了简洁的API接口,使得开发者能够快速上手并轻松集成...

    JDK1.6中文开发API

    2. **枚举(Enums)**:JDK1.5引入,1.6继续完善,枚举类型为常量集合提供了一种强大的、类型安全的表示方式。枚举类型不能被实例化,有助于防止错误和提高代码质量。 3. **并发(Concurrency)**:1.6版本对并发库...

    java 枚举类总结

    ### Java 枚举类总结 #### 一、概述与基本概念 枚举类型(`enum`)是Java中的一种特殊类,它允许开发者定义一组命名的常量,并将其视为一个独立的...对于开发人员来说,熟练掌握枚举类型的使用方法是非常有帮助的。

    JDK 1.6 API中文完整版

    2. **枚举(Enums)**:JDK 1.5引入的枚举类型,为创建固定的、有限数量的常量提供了一种强类型的方法,比传统的常量类更安全,使用也更便捷。 3. **并发编程改进**:JDK 1.6增强了并发编程的支持,包括`java.util....

    jdk-1_5_0_17-windows-i586-p.rar_JDK安装包_jdk-1-5-0-07_jdk-1_5_0_17

    JDK 1.5(代号Tiger)引入了许多重要的新特性,如增强的for循环(foreach),枚举类型,泛型,匿名内部类的改进,动态代理等,这些特性极大地提高了Java的生产力和代码的可读性。 总结来说,JDK 1.5.0_17是Java开发...

    java帮助文档

    总之,"java帮助文档"是每个Java开发者必备的学习和工作工具,无论你是新手还是资深程序员,都应该熟练掌握如何使用它来提升自己的编程技能和效率。通过深入研读JDK 1.5的API,你将能够更好地理解和运用这个强大的...

    jdk学习手册

    枚举类型是一种特殊的类,用于定义一组固定的值。它提高了代码的可读性和可维护性,避免了使用常量整数或字符串来表示特定状态或选项。 **9. 自动装箱/拆箱** 自动装箱是将基本数据类型转换为对应的包装类对象,...

    Jdk api 1.6中文文档

    8. **枚举类型**:自JDK 1.5引入以来,枚举成为了一种新的数据类型,比传统的常量更安全,更易于管理。 9. **注解(Annotation)**:1.6版本继续支持注解,这是一种元数据,可以添加到代码的各个部分,用于编译器...

    java jdk-api中文

    8. **泛型**:从JDK 5开始引入,泛型可以增强类型安全并减少类型转换的代码,如`List<String>`。 9. **枚举**:`enum`关键字使得定义常量集合更加方便,同时具备了类的一些特性。 10. **注解(Annotation)**:JDK...

    jdk 1.6 带索引 api

    2. **枚举类型的增强**:增加了枚举的构造函数,支持枚举实例的比较(compareTo())和遍历(values())。此外,EnumSet和EnumMap的引入为枚举提供了更高效的数据结构。 3. **NIO.2(New I/O 2)**:JDK 1.6引入了...

Global site tag (gtag.js) - Google Analytics