SCJP认证 1.5.5(2) 声明枚举

    技术2022-05-20  36

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

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

    enum CoffeeSize { // 8, 10, 16 are passed to the constructor BIG(), HUGE, OVERWHELMING(16) CoffeeSize(int ounces){// constructor this ounces = ounces; } private int ounces; // an instance variable public int getOunces(){ return ounces; } class Coffee { CoffeeSize size; //each instance of Coffee has an enum public static void main(String[] args){ Coffee drink1 = new Coffee(); drink1.size = CoffeeSize.BIG; Coffee drink2 = new Coffee(); drink2.size = CoffeeSize.HUGE; System.out.println(drink.size.getOunces());// prints 8 for(CoffeeSize cs : CoffeeSize.values){ System.out.println(cs + " " + cs.getOunces()); } } } }

    它会产生如下结果:

    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常量。

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

    enum CoffeeSize{ BIG(8), HUGE(10), OVERWHELMING(16){ public String getLidCode(){ return "A"; } }; //the smicolon is REQUIRED when more code follows CoffeeSize(int ounces){ this.ounces = ounces; } private int ounces; public int getOunces(){ // this method is overridden // by the OVERWHELMING constant return ounces; } public String getLidCode(){ return "B";// the default value we want to return for // CoffeeSize constants } }

     

     


    最新回复(0)