前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java enum的用法详解

Java enum的用法详解

作者头像
java干货
发布2021-02-17 17:28:02
8310
发布2021-02-17 17:28:02
举报
文章被收录于专栏:java干货

完整代码示例如下:

代码语言:javascript
复制
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);
        }
    }
}

输出结果如下:

代码语言:javascript
复制
演示枚举类型的遍历。。。。。
当前灯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

通常定义常量方法和枚举定义常量方法区别

常量代码如下

代码语言:javascript
复制
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多路分发

参考链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/11/01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通常定义常量方法和枚举定义常量方法区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档