完整代码示例如下:
package com.merryyou.enmu;
import java.util.EnumMap;
import java.util.EnumSet;
/**
* Created on 2016/11/1 0001.
*
* @author zlf
* @since 1.0
*/
public class LightTest {
//1.定义枚举类型
public static void main(String[] args) {
//1.遍历枚举类型
System.out.println("演示枚举类型的遍历。。。。。");
testTraversalEnum();
//2.演示EnumMap对象的使用
System.out.println("演示EnumMap对象的使用。。。。。");
testEnumMap();
//3.演示EnumSet对象的使用
System.out.println("演示EnumSet对象的使用。。。。。");
testEnumSet();
}
/**
* 演示EnumSet对象的使用 EnumSet是一个抽象类,获取一个类型的枚举类型内容<BR/>
*/
private static void testEnumSet() {
EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);
for (Light aLightSetElement : currEnumSet) {
System.out.println("当前EnumSet中数据为:" + aLightSetElement);
}
}
/**
* 演示EnumMap对象的使用 EnumMap跟HashMap的使用差不多,只不过key要是枚举类型
*/
private static void testEnumMap() {
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(Light.class);
currEnumMap.put(Light.GREEN, "绿灯");
currEnumMap.put(Light.RED, "红灯");
currEnumMap.put(Light.YELLLOW, "黄灯");
for (Light light : Light.values()) {
System.out.println("[key=" + light.name() + ",value=" + currEnumMap.get(light) + "]");
}
}
/**
* 演示枚举类型遍历
*/
private static void testTraversalEnum() {
Light[] values = Light.values();
for (Light light : values) {
System.out.println("当前灯name:" + light.name());
System.out.println("当前灯ordinal:" + light.ordinal());
System.out.println("当前灯name:" + light);
}
}
public enum Light {
//利用构造函数传参
RED(1), GREEN(2), YELLLOW(3);
//定义私有变量
private int nCode;
Light(int _nCode) {
this.nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf(nCode);
}
}
}
输出结果如下:
演示枚举类型的遍历。。。。。
当前灯name:RED
当前灯ordinal:0
当前灯name:1
当前灯name:GREEN
当前灯ordinal:1
当前灯name:2
当前灯name:YELLLOW
当前灯ordinal:2
当前灯name:3
演示EnumMap对象的使用。。。。。
[key=RED,value=红灯]
[key=GREEN,value=绿灯]
[key=YELLLOW,value=黄灯]
演示EnumSet对象的使用。。。。。
当前EnumSet中数据为:1
当前EnumSet中数据为:2
当前EnumSet中数据为:3
Disconnected from the target VM, address: '127.0.0.1:54153', transport: 'socket'
Process finished with exit code 0
通常定义常量方法和枚举定义常量方法区别
常量代码如下
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
- 首先,它不是类型安全的。你必须确保是int,其次,你还要确保它的范围是0和1最后,很多时候你打印出来的时候,你只看到 1 和0 ,
- 可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。(java是单继承,它已经继承了Enum),可以添加其他方法,覆盖它本身的方法
- switch()参数可以使用enum了
- values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例
- 无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
- 使用EnumSet代替标志。enum要求其成员都是唯一的,但是enum中不能删除添加元素。
- EnumMap的key是enum,value是任何其他Object对象。
- enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为。
- 使用enum的职责链(Chain of Responsibility) .这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。
- 使用enum的状态机
- 使用enum多路分发
参考链接: