java枚举类Enum方法简介(valueof,value,ordinal)

转载 2015年07月07日 19:07:53
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枚举类Enum方法简介(valueof,value,ordinal)

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

枚举类enum的values()方法

关于枚举,相信使用的已经很普遍了,现在主要写的是枚举中的一个特殊方法,values(), 为什么说特殊呢,因为在Enum 的 API 文档中也找不到这个方法。接下来就看看具体的使用。      理论...
  • kdc18333608478
  • kdc18333608478
  • 2017年06月02日 16:45
  • 1100

java.lang.Enum.valueOf()方法实例

转:http://www.yiibai.com/java/lang/enum_valueof.html java.lang.Enum.valueOf() 方法返回指定名称enumtype的枚举常...
  • daweibalang717
  • daweibalang717
  • 2014年12月05日 14:36
  • 11738

java枚举类Enum方法简介(valueof,value,ordinal)

                                                                         ...
  • dongsheng186
  • dongsheng186
  • 2015年04月15日 17:27
  • 238

枚举类应用

例1:无参枚举类其中RED,GREEN,BLACK分别代表一个Color对象,是一个Color对象的实例 public enum Color { RED, GREEN, BLACK; ...
  • u010502101
  • u010502101
  • 2018年02月04日 19:40
  • 19

java.lang.Enum.valueOf()方法实例

import java.lang.*;// enum showing Mobile prices enum Mobile { Samsung(400), Nokia(250),Motorola(...
  • qq_29134495
  • qq_29134495
  • 2016年07月05日 10:30
  • 1035

Java中如何由枚举常量的ordinal值获得枚举常量对象

Java1.5提供了关键字enum,可以通过该关键字方便得定义自己需要的枚举类型,比如enum Season {    SPRING, SUMMER, AUTUMN, WINTER}就定义了一个季节枚...
  • brooksychen
  • brooksychen
  • 2008年11月20日 21:08
  • 31546

Hibernate开发常见问题的分析解决

问题:IllegalArgumentException: Unknown ordinal value for enum class com.pptv.cdn.platform.service.play...
  • lxb_champagne
  • lxb_champagne
  • 2013年12月11日 14:55
  • 2004

Kotlin学习之枚举类

枚举类最基本的用法是实现一个类型安全的枚举。 什么叫类型安全的枚举类呢? 在java中像Color里面就有很常见的:Color.BLACK,Color.WHITE之类的,像Color的这种设计就被...
  • u014134488
  • u014134488
  • 2016年04月06日 16:05
  • 3409

java枚举enum类中的values()

**java枚举enum中的values()** 近两天在看spring源码时在用EA工具逆向生成spring-web的ER图看到了HttpMethod()这个枚举类,如图 这个类中的静态块 ...
  • u013469218
  • u013469218
  • 2017年03月26日 15:51
  • 396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java枚举类Enum方法简介(valueof,value,ordinal)
举报原因:
原因补充:

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