JDK 1.5新特性---枚举类型


  Enum的最 容易 模式,即 类似于:

  public enum Color {

  Red,

  Green,

  Blue;

  }

  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作为一个崭新定义的类型,是 盼望 可以协助程序员写出的代码更加 容易易懂 。