免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1886 | 回复: 1
打印 上一主题 下一主题

Enum枚举类解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-13 17:08 |只看该作者 |倒序浏览
Enum枚举类解析






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

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

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

  3.   3.Enum默认实现了java.lang.Comparable接口。

  4.   4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.

  5.   5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。

  6.   6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

  7.   7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

  8.   了解了这些基本特性,我们来看看如何使用它们。

  9.   1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。

  10.   for (Color c: Color.values())

  11.   System.out.println(“find value:” + c);

  12.   2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。

  13.   public enum Color {

  14.   Red,

  15.   Green,

  16.   Blue;

  17.   /*

  18.   *定义一个变量表示枚举值的数目。

  19.   *(我有点奇怪为什么sun没有给enum直接提供一个size方法).

  20.   */

  21.   private static int number = Color.values().length ;

  22.   /**

  23.   * 随机返回一个枚举值

  24.   @return a random enum value.

  25.   */

  26.   public static Color getRandomColor(){

  27.   long random = System.currentTimeMillis() % number;

  28.   switch ((int) random){

  29.   case 0:

  30.   return Color.Red;

  31.   case 1:

  32.   return Color.Green;

  33.   case 2:

  34.   return Color.Blue;

  35.   default : return Color.Red;

  36.   }

  37.   }

  38.   }
复制代码
  可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。

  3.覆载(Override)toString, valueOf方法

  前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。

  ….
  1.   public String toString(){

  2.   switch (this){

  3.   case Red:

  4.   return "Color.Red";

  5.   case Green:

  6.   return "Color.Green";

  7.   case Blue:

  8.   return "Color.Blue";

  9.   default:

  10.   return "Unknow Color";

  11.   }

  12.   }
复制代码
  ….

  这时我们可以看到,此时再用前面的遍历代码打印出来的是

 
  1.  Color.Red

  2.   Color.Green

  3.   Color.Blue

  4.   而不是

  5.   Red

  6.   Green

  7.   Blue.
复制代码
  可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。

  4.使用构造函数

  虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。

 
  1.  public enum Color {

  2.   Red("This is Red"),

  3.   Green("This is Green"),

  4.   Blue("This is Blue");

  5.   private String desc;

  6.   Color(String desc){

  7.   this.desc = desc;

  8.   }

  9.   public String getDesc(){

  10.   return this.desc;

  11.   }

  12.   }
复制代码
  这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。

  要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。

  5.实现特定的接口

  我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。

  6.定义枚举值自己的方法。

  前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
  1.   public enum Color {

  2.   Red {

  3.   public String toString(){

  4.   return "Color.Red";

  5.   }

  6.   },

  7.   Green {

  8.   public String toString(){

  9.   return "Color.Green";

  10.   }

  11.   },

  12.   Blue{

  13.   public String toString(){

  14.   return "Color.Blue";

  15.   }

  16.   };

  17.   }
复制代码
  从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。

  总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。

论坛徽章:
0
2 [报告]
发表于 2011-11-14 09:39 |只看该作者
很透彻....希望与ll能多交流...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP