1. Java枚举原理
Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易
见的,不仅可以保证单例,且比较时候可以 用”==”来替换equals,是一种好的习惯。JDK1.5之前没有Enum这个
类型,那时候一般用接口常量来替代。有了JavaEnum之后,可以更贴近的表示这种常量,它的语法结构尽管和
Java类的语法不一样,但是经过编译器编译之后产生的仍是一个class文件。该class文件经过反编译可以看到实
际上是生成了一个类,该类继承自java.lang.Enum<E>.
2. 使用Java Enum
(1) 使用案例1:
import java.util.EnumMap; import java.util.EnumSet; public class EnumTest { // 定义一个enum枚举类型,包括两个实例ON,OFF public enum State { ON, OFF }; // 测试函数 public static void main(String[] args) { // 直接变量enum for (State s : State.values()) { System.out.println(s.name()); } // switch与enum的结合使用 State switchState = State.OFF; switch (switchState) { case OFF: System.out.println("OFF"); break; case ON: System.out.println("ON"); break; } // EnumSet的使用 EnumSet<State> stateSet = EnumSet.allOf(State.class); for (State s : stateSet) { System.out.println(s); } // EnumMap的使用 EnumMap<State, String> stateMap = new EnumMap<State, String>(State.class); stateMap.put(State.ON, "is On"); stateMap.put(State.OFF, "is off"); for (State s : State.values()) { System.out.println(s.name() + ":" + stateMap.get(s)); } } }
(2) 使用案例2:
public enum TestEnumMathod { // 为每个enum实例添加不同的实现方法 SAMPLE1 { String getInfo() { return "SAMPLE1"; } }, SAMPLE2 { String getInfo() { return "SAMPLE2"; } }; abstract String getInfo(); // 测试 public static void main(String args[]) { for (TestEnumMathod method : values()) { System.out.println(method.getInfo()); } } }
3. 使用总结
(1). 代码:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
上述代码定义常量的缺点:
首先,它不是类型安全的,必须确保是int;
其次,要确保它的范围是0和1,
最后,很多时候你打印出来的时候,你只看到 1 和0 ,
但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final常量吧
(2). 可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。(java是单继承,它已经继
承了Enum), 可以添加其他方法,覆盖它本身的方法;
(3). switch()参数可以使用enum了;
(4). values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum时,
values() 就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中
没有values()方法,我们仍然可 以通过Class对象取得所有的enum实例;
(5). 无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此
将元素进行分组。达到将枚举元素进行分组;
(6). 使用EnumSet代替标志。enum要求其成员都是唯一的,但是enum中不能删除添加元素;
(7). EnumMap的key是enum,value是任何其他Object对象;
(8). enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为;
(9). 使用enum的职责链(Chain of Responsibility) .这个关系到设计模式的职责链模式。以多种不同的方法来解
决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处
理该请求;
(10). 使用enum的状态机;
(11). 使用enum多路分发。