Java enum的用法详解

2016/11/01 Java

完整代码示例如下:

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;

}
  1. 首先,它不是类型安全的。你必须确保是int,其次,你还要确保它的范围是0和1最后,很多时候你打印出来的时候,你只看到 1 和0 ,
  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多路分发

参考链接:

Show Disqus Comments

Search

    Post Directory