`

掌握JDK1.5枚举类型

    博客分类:
  • java
 
阅读更多

[转载]   掌握JDK1.5枚举类型
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,   它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。   当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。  

  1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。  

  2.所有枚举值都是public   ,   static   ,   final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义   变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。  

  3.Enum默认实现了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的一些高级特性,否则就和简单易懂的初衷想违背了。

分享到:
评论

相关推荐

    2022年掌握JDK1.5枚举类型Java教程.docx

    Java中的枚举类型(Enum)是在JDK 1.5版本中引入的一种特殊的类类型,它的设计目的是为了更好地管理和使用一组固定的常量。枚举在Java中提供了比传统的final常量更安全、更灵活的机制。以下是关于Java枚举类型的一些...

    JDK1.5,JDK1.5

    对于Java开发者来说,理解和掌握JDK1.5的这些关键特性至关重要,因为它们不仅在JDK1.5中首次出现,也成为了后续版本的基础。通过深入学习和实践,开发者能够写出更安全、更高效、更易于维护的代码。

    jdk1.5.rar

    JDK 1.5引入了枚举类型,使枚举更安全、更易于使用,同时也支持枚举的继承和方法。 其次,自动装箱与拆箱是另一个显著特性。在JDK 1.5之前,开发者需要手动进行基本类型与其对应的包装类之间的转换。从这个版本开始...

    JDK1.5、JDK5下载

    3. **枚举类型(Enums)**:枚举是一种新的数据类型,用于定义有限集合的常量,提高了枚举的类型安全性和可维护性。 4. **变量注解(Annotations)**:变量注解提供了一种元数据机制,可以将信息附加到代码的元素上...

    linux下JDK1.5

    本文将深入探讨Linux下JDK1.5的相关知识点,帮助用户更好地理解和使用这个版本的Java开发环境。 首先,安装JDK1.5在Linux系统中通常涉及以下步骤: 1. **下载**:你需要从Oracle官方网站或者第三方镜像站点下载...

    jdk1.5_forLinux.zip

    2. **枚举类型**:Java 1.5引入了枚举,用于表示有限的固定集合,替代了传统的常量类,使代码更加清晰、可读性更强。 3. **自动装箱与拆箱**:自动装箱和拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,...

    java-JDK1.5

    JDK1.5引入的枚举类型使得枚举成为一种独立的、更安全的类型,支持方法和变量,提高了代码的可读性和安全性。 其次,泛型(Generics)的引入是JDK1.5的另一大亮点。泛型允许开发者在定义类、接口和方法时指定参数...

    JDK1.5中文版

    1. **泛型(Generics)**:泛型是JDK1.5引入的一项重要功能,它允许在类、接口和方法中定义类型参数,以增强类型安全性,减少运行时的类型转换,并且在编译阶段就能捕获可能存在的类型错误。泛型的使用使得集合框架...

    jdk1.5中文帮助文档

    2. **枚举类型**:JDK 1.5增加了枚举类型,使得枚举常量的使用更加规范和安全,避免了传统常量定义方式可能引发的问题,如命名冲突和类型安全问题。 3. **自动装箱与拆箱**:此版本中,Java实现了基本类型和其对应...

    jdk1.5中文api

    《深入解析JDK1.5中文API》 Java Development Kit(JDK)是Java编程语言的核心组成部分,提供了编译、运行Java程序所需的所有工具和库。JDK 1.5,也被称为Java SE 5.0,是Java历史上的一个重大版本,引入了许多新的...

    JDK1.5 API完整版

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

    jdk1.5(jdk-1_5_0_08-windows-i586-p.exe)

    JDK 1.5引入了枚举类型,使得定义常量集合更为规范,增强了类型安全并降低了错误的可能性。 3. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱和拆箱简化了基本类型与对应的包装类之间的转换,使得代码...

    JDK1.5 windows版64位 免安装版

    2. **枚举(Enums)**:枚举类型为常量集合提供了正式的支持,它比传统的final static变量更安全,更易于理解和使用。 3. **自动装箱/拆箱(Autoboxing and Unboxing)**:自动装箱允许在基本类型与对应的包装类...

    jdk1.5.0-21

    JDK 1.5引入了枚举类型,这是一种预定义好的类,用于表示一组固定数量的值。枚举提供了比常量更强大的功能,可以拥有方法、实现接口,使得常量的管理更加规范和安全。 3. **自动装箱/拆箱(Autoboxing and ...

    jdk_1.5_x86

    1. **泛型(Generics)**: JDK 1.5引入了泛型,这是一种类型安全机制,允许在代码中创建参数化类型,如集合,可以指定元素的类型。这提高了代码的可读性和安全性,减少了类型转换错误。 2. **枚举(Enums)**: 之前...

    jdk1.5 oracle官方版

    3. **枚举(Enums)**:枚举类型为Java提供了更安全的常量表示方式,避免了使用final static变量来模拟枚举可能导致的问题。 4. **变量赋值注解(Annotations)**:注解是一种元数据,可以在源代码中声明,用于...

    jdk1.5绿色版

    3. **枚举类型(Enums)**:JDK1.5开始支持枚举类型,使得枚举常量更规范,更易于管理和使用,避免了传统的final static常量存在的问题。 4. **变长参数(Varargs)**:允许在方法声明中使用省略号“...”作为最后...

    jdk1.5专用包

    JDK 1.5引入了枚举类型,它提供了一种安全的方式来表示有限集合的值。枚举可以有方法,可以实现接口,使得它们在处理常量集合时更加强大且易于理解。 4. **变量赋值增强(Enhanced For Loop)** 也称为foreach...

    jdk1.5Java工具

    之前的Java版本中,枚举通常通过常量类来实现,而JDK 1.5引入了内置的枚举类型,使得枚举更易用且安全。枚举可以包含常量、方法和构造函数,有助于创建更规范的API。 四、变量赋值与初始化块(Enhanced for loop) ...

Global site tag (gtag.js) - Google Analytics