概念:
被enum关键字修饰的类型就是枚举类型,枚举类型都隐式继承Enum,根据java不可以多继承的原理,不能再继承其他类
枚举类型中类可以定义变量和方法,如果不添加如何方法,枚举值的默认值默认从0开始
枚举类型的构造方法必须是私有的,
[public]enum 枚举类型名称[implements 接口名称列表]
{
枚举值;
变量成员声明及初始化;
方法声明及方法体;
}
示例:
enum Color{Red,BLUE,GREEN}
方法:
values():主要返回enum实例的数组,而且该数组中的元素严格保持在enum中声明时的顺序。
静态的values()方法用于获得枚举类型的枚举值的数组
toString():返回枚举值字符串的描述
name():返回实例名
ordinal(): 返回实例声明时的次序,从0开始。
getDeclaringClass():返回实例所属的enum类型
valueOf():方法将以字符串形式表示的枚举值转化为枚举类型的对象
equals():判断是否为同一个对象。也可以使用 == 来比较 enum实例
特性:
除了不能被继承,可以把它当作一个常规的类。不能被继承是因为默认都是public static final
不可以使用=赋值,可以通过方法来显示赋值
enum可以有普通方法,静态方法,抽象方法,构造方法
可以实现接口
工具类:
EnumSet:枚举类型Set实现,它要求放入它的枚举常量必须属于同一个枚举类型。
EnumMap:是枚举类型的Map实现,相对比较高效,它也是只能接收同一个枚举类型的实例作为键值。
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { ... }
//枚举可以添加普通方法、静态方法、抽象方法、构造方法
public enum ErrorCode {
OK(0) {
public String getDescription() {
return "成功";
}
},
ERROR_A(100) {
public String getDescription() {
return "错误A";
}
},
ERROR_B(200) {
public String getDescription() {
return "错误B";
}
};
private int code;
// 构造方法:enum的构造方法只能被声明为private权限或不声明权限
private ErrorCode(int number) { // 构造方法
this.code = number;
}
public int getCode() { // 普通方法
return code;
} // 普通方法
public abstract String getDescription(); // 抽象方法
public static void main(String args[]) { // 静态方法
for (ErrorCode s : ErrorCode.values()) {
System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
}
}
}
// EnumSet的使用
System.out.println("EnumSet展示");
EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class);
for (ErrorCodeEn e : errSet) {
System.out.println(e.name() + " : " + e.ordinal());
}
// EnumMap的使用
System.out.println("EnumMap展示");
EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class);
errMap.put(StateMachine.Signal.RED, "红灯");
errMap.put(StateMachine.Signal.YELLOW, "黄灯");
errMap.put(StateMachine.Signal.GREEN, "绿灯");
for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) {
Map.Entry<StateMachine.Signal, String> entry = iter.next();
System.out.println(entry.getKey().name() + " : " + entry.getValue());
}