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)的更多相关文章

  1. Java枚举类enum

    枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enu ...

  2. java 枚举 类 enum

    public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializab ...

  3. java 枚举类 enum 总结

    枚举定义: enum是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量 ...

  4. Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  5. java枚举类

    enum关键字用于定义枚举类,若枚举只有一个成员, 则可以作为一种单例模式的实现方式.   枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰. 枚举类的使用 priva ...

  6. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  7. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  8. Java基础15:深入剖析Java枚举类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

随机推荐

  1. Maven - 下载JAR包

    进入Spring官网http://projects.spring.io/spring-framework/假设我们想下载Spring发现仅仅能 通过Maven或Cradle进行下载了. 以下以Spri ...

  2. C++编译错误 2001 1120

    无法解析的外部符号"symbol" 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 该错误信息之后为错误 LNK1120. 可能的原因 : 在将托管库或 W ...

  3. python pyinotify模块详解

    转载于http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23504396&id=2929446 1年多前就看过相关内容了, ...

  4. Xcode5.1.1+ios 7.1.2 免证书真机调试

    Xcode假设不破解.无法真机调试, 也无法编译真机Release文件.仅仅有付费开通Apple开发人员账号,才干申请真机调试.而Xcode进行破解后,结合越狱的iPhone或iPad, 就可以免官方 ...

  5. IOS下SQLite的简单使用

    本文转载至 http://www.cnblogs.com/cokecoffe/archive/2012/05/31/2537105.html 看着国外网站的教程,写了一个小例子,一个联系人的程序,包括 ...

  6. docker: Dockerfile命令介绍

    前一章介绍了Dockerfile创建镜像的方法,Dockerfile文件都是一些指令,因此要掌握Dockerfile就必须了解这些指令.这一章就介绍下Dockerfile的指令. From: 功能为指 ...

  7. 初学php html javascript后小总结

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/c3568/article/details/30474015 转载请注明出处:http://blog. ...

  8. CentOS 64位 6.4 命令行安装 oracle 11g 客户端

    1.官网下载oracle 客户端(需登录) http://download.oracle.com/otn/linux/instantclient/11204/oracle-instantclient1 ...

  9. 【智能无线小车系列九】在树莓派上使用USB摄像头

    材料准备: 1.树莓派 2.AS 4WD小车 3.WebCam 4.小米移动电源 5.TP—LINK 高增益150MUSB无线网卡 操作流程: 1.将WebCam插上树莓派后,首先要确认树莓派是否支持 ...

  10. POJ2115 C Looooops ——模线性方程(扩展gcd)

    题目链接:http://poj.org/problem?id=2115 C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...