在枚举出现前,都是 使用常量的方式,如
public static final int APPLE_FUJI = 0;
public static final int ORANGE_NAVEL = 0;
这种方称为枚举常量
,其弊端有:
int
发生变化,则必须重新编译java 中的枚举本质上是
int
值.
public enum Apple{FUJI}
public enum Apple{NAVEL}
final
域为 每个枚举常量 导出实例的类.final
的客户端
无法创建 枚举实例
,也不能对其 进行扩展
,因此枚举是 实例受控的,单例的泛型化
取值
一定是 枚举中的有效值
之一toString
,可以将 枚举
的值打印出来.方法和域
,并实现任意的接口
switch
,枚举中可以通过 switch(this)
来根据不同的 域
做不同的操作,示例 : Operation.java
当然,上面种方式并不好,建议使用 特定于常量的方法实现
(onstant-specific method implementation) Operation1.java
可以通过构造函数传递参数,例如,示例:Operation.java, op
打印是调用toString
打印出了+,-,*,/
;
利用策略枚举
,可以用在更加安全,灵活的场景.如:书中的加班场景,每添加一种枚举常量就强制添加一种策略
,示例代码:PayrollDay.java
switch
枚举 适合于 给外部的
枚举类型 增加特定于 常量
的行为.comparable
类型.而非 int
类型装载和初始化的时候会有 空间和时间 的成本.
枚举的
ordinal()
方法会返回枚举常量在类型中的数字位置,
但是尽量不要使用它,因为当重新排序
后,会对客户端造成破坏.
正确的做法是,将他保存在一个 实例域
中.
public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), QUARTET(4);
private final int numberOf;
Ensemble(int _i) {
this.numberOf = _i;
}
public int getNumberOf() {
return numberOf;
}
}
public class Text {
public static final int STYLE_BOLD = 1 << 0;
public static final int STYLE_ITALIC = 1 << 1;
public static final int STYLE_UNDERLINE = 1 << 2;
public static final int STYLE_STRIKETHROUGH = 1 << 3;
public void applyStyles(int styles) {
//...
}
}
public class Text {
public enum Style {
BOLD, ITALIC, UNDERLINE, STRIKETHROUGH
}
// Any Set could be passed in, but EnumSet is clearly best
public void applyStyles(Set