我试图通过对所有常量使用函数并为每个常量定义函数来制作enum
,例如说出颜色GREEN
等的信息,但是为什么我需要定义相同的抽象函数,尽管对于enum
的每个常量我已经有单独的函数。
enum color {
GREEN {
public void info() {
System.out.println("Dangerous Color: GREEN");
}
},
RED {
public void info() {
System.out.println("Dangerous Color");
}
},
BLUE {
public void info() {
System.out.println("Ordinary universal colour: BLUE");
}
};
public void info() { System.out.println("Ordinary universal colour"); }
public abstract void info();
}
public class EnumDemo4 {
public static void main(String[] args) {
color[] c = color.values();
for (color c1 : c) {
System.out.println(c1);
c1.info();
}
}
}
尽管每个常量我们已经有不同的方法,为什么我们还需要enum
常量方法之外的方法?
尽管我们已经为各个常量定义了函数,但为什么还需要添加抽象或非抽象方法呢?
答案 0 :(得分:0)
首先,您的代码无法编译。您不能在同一枚举中两次定义info()
。
此行必须删除:
public void info() { System.out.println("Ordinary universal colour"); }
无论如何,您希望它什么时候起作用?它与任何颜色都没有关联。
正确的定义如下:
enum Color {
GREEN {
@Override
public void info() {
System.out.println("Dangerous Color: GREEN");
}
},
RED {
@Override
public void info() {
System.out.println("Dangerous Color");
}
},
BLUE {
@Override
public void info() {
System.out.println("Ordinary universal colour: BLUE");
}
};
public abstract void info();
}
之所以需要在枚举级别定义abstract void info()
的原因是,您想强制枚举中的所有常量提供该常量。保证所有枚举实例都将提供它,因此c1.info()
函数中的行main()
可以正常工作。
如果您尝试删除abstract void info()
,则您的常量会巧合地 每个都实现了info()
,但是没有告诉编译器在Color
枚举中级别,您将永远拥有它。因此它将无法编译。
如果您想要一个稍微不那么庞大的定义,则可以像这样更改它,其作用相同:
enum Color {
GREEN("Dangerous Color: GREEN"),
RED("Dangerous Color"),
BLUE("Ordinary universal colour: BLUE");
private final String info;
Colour(String info) {
this.info = info;
}
public void info() {
System.out.println(info);
}
}