这是一个取自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
}
}
答案 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.size
是CoffeSize
类型,其方法为getLidCode()
。它将按预期打印重写方法的值。
答案 1 :(得分:1)
我对enum
不太熟悉,但我相信你的问题的答案是:
有两种类型的LID,Lid A和B.由于B恰好在标准尺寸的咖啡(OVERWHELMING
)的第三次声明之后,每当getLidCode()
被调用CoffeeSize
时},它匹配20
,它将返回Lid B
。如果存在任何其他手动设置的尺寸,例如12或14,或BIG
或HUGE
,则会返回A
。
所以基本上,Lid B意味着它是压倒性咖啡的标准盖子。如果客户要求提供12盎司,或18盎司,或任何其他盎司的咖啡,或者要求BIG
或HUGE
咖啡,他们会获得盖子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.BIG
和CoffeSize.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() ;
}
}
SUBTRACTION
,DIVISION
和POWER
会在调用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
乙