快捷搜索:

熟练掌握JDK1.5枚举类型

纯熟掌握JDK1.5罗列类型

在上一篇文章JDK1.5新特点简介里面,我们评论争论了Enum的最简单形式,即类似于,

public enum Color{

Red,

Green,

Blue;

}

这篇文章我们来具体先容一下enum的各项特性。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的一些高档特点,否则就和简单易懂的初衷想违抗了。

(以上代码在win2k+ 1.5.0-beta2-b51下运行经由过程)

您可能还会对下面的文章感兴趣: