枚举示例说明

时间:2013-08-07 05:02:57

标签: java scjp

这是一个取自SCJP 6例子的程序。在这里,我们创建一个具有不同咖啡大小的enum,并声明一个名为ounces的私有变量,以获取枚举值的盎司值。

我无法理解被覆盖的getLidCode方法的使用。如何访问getLidCode方法?

package com.chapter1.Declaration;

enum CoffeSize {
    BIG(8), HUGE(10), OVERWHELMING(20) {
        public String getLidCode() {
            return "B";
        }
    };

    CoffeSize(int ounce) {
        this.ounce = ounce;
    }

    private int ounce;

    public int getOunce() {
        return ounce;
    }

    public void setOunce(int ounce) {
        this.ounce = ounce;
    }

    public String getLidCode() {
        return "A";
    }
}

public class Prog7 {

    CoffeeSize size;

    public static void main(String[] args) {

        Prog7 p = new Prog7();
            p.size = CoffeeSize.OVERWHELMING;

            System.out.println(p.size.getOunces());

            //p.size.getLidCode(); ? is this correct way
        }
    }

4 个答案:

答案 0 :(得分:5)

如果你把它分开一点,那就更有意义了:

enum CoffeSize {
    BIG(8),
    HUGE(10),
    OVERWHELMING(20) {
        public String getLidCode() {
            return "B";
        }
    };
    // rest of enum code here
}

只有OVERWHELMING覆盖getLidCode()

您可以通过此方法(使用您的代码)访问它:

System.out.println(p.size.getLidCode());

原因是:p.sizeCoffeSize类型,其方法为getLidCode()。它将按预期打印重写方法的值。

答案 1 :(得分:1)

我对enum不太熟悉,但我相信你的问题的答案是:

有两种类型的LID,Lid A和B.由于B恰好在标准尺寸的咖啡(OVERWHELMING)的第三次声明之后,每当getLidCode()被调用CoffeeSize时},它匹配20,它将返回Lid B。如果存在任何其他手动设置的尺寸,例如12或14,或BIGHUGE,则会返回A

所以基本上,Lid B意味着它是压倒性咖啡的标准盖子。如果客户要求提供12盎司,或18盎司,或任何其他盎司的咖啡,或者要求BIGHUGE咖啡,他们会获得盖子A.

总结:

 p.size = CoffeeSize.BIG;
 System.out.println(p.size.getOunces()); // Outputs "8"
 System.out.println(p.size.getLidType()); // Outputs "A"

 p.size = CoffeeSize.OVERWHELMING;
 System.out.println(p.size.getOunces()); // Outputs "20"
 System.out.println(p.size.getLidType()); // Outputs "B"

 p.size = CoffeeSize(12);
 System.out.println(p.size.getOunces()); // Outputs "12"
 System.out.println(p.size.getLidType()); // Outputs "A"

 p.setOunce(20);
 System.out.println(p.size.getOunces()); // Outputs "20"
 System.out.println(p.size.getLidType()); // Outputs "B"

答案 2 :(得分:1)

方法getLidCode通常返回常量“A”。对于CoffeSize.BIGCoffeSize.HUGE,它不会被覆盖,因此这是它们将返回的值。但是,对于CoffeSize.OVERWHELMING,它会被覆盖,它将返回“B”。

如果您将枚举视为类及其枚举值作为该类的实例,则枚举允许基于每个对象的方法覆盖。对于常规类/对象,这是不可能的。

这也可以实现为:

enum CoffeSize {
    BIG(8,"A"), HUGE(10,"A"), OVERWHELMING(20,"B");

    CoffeSize(int ounce,String lidCode) {
        this.ounce= ounce ;
        this.lidCode= lidCode ;
    }

    private int ounce;
    private String lidCode;

    public int getOunce() {
        return this.ounce ;
    }
    public void setOunce(int ounce) {
        this.ounce= ounce ;
    }
    public String getLidCode() {
        return this.lidCode ;
    }
}

请注意,要使此备用实现更接近原始实现,不会定义setLidCode方法。

在下面的例子中,可以更容易地理解这种机制的真正力量:

enum BinaryOperation {
    ADDITION("+",1) {
        public double operate(double a,double b) {
            return a + b ;
        }
    },
    SUBTRACTION("-",1),
    MULTIPLICATION("*",2) {
        public double operate(double a,double b) {
            return a * b ;
        }
    },
    DIVISION("/",2),
    POWER("**",3);

    BinaryOperation(String repr,int priority) {
        this.repr= repr ;
        this.priority= priority ;
    }

    private String repr;
    private int priority;

    public String toString() {
        return this.repr ;
    }
    public int getPriority() {
        return this.priority ;
    }
    public double operate(double a,double b) {
        throw new UnsupportedOperationException() ;
    }
}

SUBTRACTIONDIVISIONPOWER会在调用operate方法时抛出异常(由于某种原因,此时仅实施了可交换操作) 。但是,BinaryOperation.ADDITION.operate(3.5,2.1)BinaryOperation.MULTIPLICATION.operate(4.5,2.0)将返回预期值(分别为5.6和9.0)。这也回答了您关于使用的问题。是的,你的初步例子是正确的。

没有简单的OO方法可以使用字段或其他机制来实现此目的。

答案 3 :(得分:0)

请注意,它是getOunce而不是getOunces。 以下是正确的用法。

public class Prog7 {

CoffeSize size;

public static void main(String[] args) {

Prog7 p = new Prog7 ();
p.size = CoffeSize .OVERWHELMING;

System.out.println(p.size.getOunce());

System.out.println(p.size.getLidCode());

}

}

这会将输出显示为:

20