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