SCJP认证 1.5.5(2) 声明枚举

来源:互联网 发布:jquery 数组增删 编辑:程序博客网 时间:2024/05/16 12:49

因为枚举确实是一种特殊的类,因而它不仅仅用于列出枚举的常量值。可以为枚举添加构造函数、实例变量、方法,以及一种称为“常量特定类体”(constant specific class body)的奇怪东西。为了理解为什么在枚举中可能需要更多功能,对上述例子考虑如下这种情形:假设你想知道实际的大小(以盎司为单位)它们映射到3个CoffeeSize常量中的每一个常量。例如,你想知道BIG是8盎司,HUGE是10盎司,而OVERWHELMING是巨大的16盎司。

虽然可以使用某种其他的数据结构制作某种查找表,但这不是一个号的设计,并且难于维护。最简单的方式是将枚举值(BIG、HUGE和OVERWHELMING) 是做对象,它们都可以具有自居的实例变量。然后,可以通过将值传递给枚举构造函数,在初始化枚举时同时赋予这些值。着需要做一点解释,我们首先看一下如下的代码:

它会产生如下结果:

8

BIG 8

HUGE 10

OVERWHELMING 16

 

注意,每个枚举都有一个静态方法values(),它以声明枚举值是的顺序返回这些值的一个数组。

对于枚举构造函数,要重点集中丶两点如下所示。

永远不能直接调用枚举构造函数。通过在常量后面定义的变元,会自动调用枚举构造函数。例如,如用BIG(8) 调用CoffeeSize构造函数,则会获取一个int变元,冰箭int型字面值8传递个i构造函数(当然,在这种情况下,可以摄像BIG也会传递给构造函数,但是,我们不必知道或者说不必关系其细节)。

可以为沟改造函数定义多个变元,并且重载枚举构造函数,就像重载一个普通的类构造函数一样。第2章将更详细地讨论构造函数。为了同时用盎司数和(例如) 盖子类型初始化CoffeeType,可将带两个变元的BIG(8, 'A')传递给构造函数,这意味着在CoffeeSize中有一个构造函数,它同时具有一个int变元和一个String变元。

最后,可以在枚举中定义一个奇怪的东西,它看起来就像匿名内部类一样(匿名内部类将在第8章讨论) 。它被称作常量特顶类体,当需要特殊的常量一重写枚举中定义的方法时,就可以使用它。

摄像如下这种场景:你想让枚举具有两个方法,一个用于盎司数,一个用于盖子代码(String类型) 。现在摄像多数咖啡(杯)使用相同的盖子代码“B”,但是需要有一种方法为OVERWHELMING二重写该方法。你不希望在方法中编写一些难以维护的if/then代码,因此,最佳办法是以某种方式获得拥有重写getLidCode()方法的OVERWHELMING常量。

这看起来有些奇怪,但理解了如下基本的生命规则之后,就不觉得奇怪了。