掌握JDK1.5枚举类型

转载 2007年09月16日 20:40:00
转自:http://www.it.com.cn/f/edu/053/29/93843.htm

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

java jdk1.5 特性 -- 枚举类型 Enum的使用与分析

Enumeration 是一个接口,声明有hasMoreElements 和 nextElement 方法, Java中的Enum的使用与分析 示例: public ...
  • xiaofengxiaoling
  • xiaofengxiaoling
  • 2013年02月22日 13:51
  • 415

jdk1.5之后的新特性

jdk1.5之后的新特性:       泛型       枚举       静态导入       自动拆箱装箱       增强for循环        可变参数...
  • u010918487
  • u010918487
  • 2015年09月20日 00:58
  • 486

JDK1.5枚举类型学习

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。当我们在声明一个enum类型时,我们应该注意到enum类型有如...
  • u013594602
  • u013594602
  • 2014年02月04日 12:09
  • 369

JDK1.5以后各版本新特性

JDK各个版本的新特性   对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言。今天先为...
  • ynwso
  • ynwso
  • 2015年08月03日 10:13
  • 2240

jdk1.5之后String...的使用

转载地址: http://blog.csdn.net/wangxw8746/article/details/25056369?utm_source=tuicool&utm_medium=referr...
  • wangyonglin1123
  • wangyonglin1123
  • 2016年06月18日 22:12
  • 315

枚举类型的使用

枚举类型的使用
  • xsyyjzwh
  • xsyyjzwh
  • 2015年08月31日 21:23
  • 1463

C#枚举类型的常用操作总结

枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system...
  • pengze0902
  • pengze0902
  • 2016年11月27日 19:45
  • 1102

enum枚举类型详解

1. 枚举的定义枚举类型定义的一般形式为:     enum 枚举名{ 枚举值表 };     在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。      例如: 该枚举名为weekday...
  • xinyuan510214
  • xinyuan510214
  • 2016年03月18日 17:41
  • 2982

MYSQL数据库中的枚举类型和集合类型

枚举类型,enum 一般来说就是单选,在定义枚举的时候列出所有的可能性; 代码如下 create table type_enum( gender enum('male','remale','s...
  • woshinannan741
  • woshinannan741
  • 2016年01月14日 18:13
  • 7796

深入理解枚举类型之基础用法

参考资料       1.Java编程思想        2.JAVA EMNU        3.java enum(枚举)使用详解 + 总结...
  • IO_Field
  • IO_Field
  • 2016年05月16日 21:19
  • 1806
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:掌握JDK1.5枚举类型
举报原因:
原因补充:

(最多只允许输入30个字)