java enum(枚举)使用详解 + 总结

2023-05-16

enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:

1. 原始的接口定义常量

2. 语法(定义)

3. 遍历、switch 等常用操作

4. enum 对象的常用方法介绍

5. 给 enum 自定义属性和方法

6. EnumSet,EnumMap 的应用

7. enum 的原理分析

8. 总结

 

原始的接口定义常量


public interface IConstants {
    String MON = "Mon";
    String TUE = "Tue";
    String WED = "Wed";
    String THU = "Thu";
    String FRI = "Fri";
    String SAT = "Sat";
    String SUN = "Sun";
}  

语法(定义)

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。


package com.xindatai.ibs.lime;

public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}  

这段代码实际上调用了7次 Enum(String name, int ordinal):


new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
...
...  

遍历、switch 等常用操作

对enum进行遍历和switch的操作示例代码:


package com.xindatai.ibs.lime;

public class Lime {
    public static void main(String[] args) {
        for (EnumTest e : EnumTest.values()) {
            System.out.println(e.toString());
        }
         
        System.out.println("----------------我是分隔线------------------");
         
        EnumTest test = EnumTest.TUE;
        switch (test) {
        case MON:
            System.out.println("今天是星期一");
            break;
        case TUE:
            System.out.println("今天是星期二");
            break;
        // ... ...
        default:
            System.out.println(test);
            break;
        }
    }
}  

Console : 


MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二  

enum 对象的常用方法介绍

int compareTo(E o) 
          比较此枚举与指定对象的顺序。

Class<E> getDeclaringClass() 
          返回与此枚举常量的枚举类型相对应的 Class 对象。

String name() 
          返回此枚举常量的名称,在其枚举声明中对其进行声明。

int ordinal() 
          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String toString()

           返回枚举常量的名称,它包含在声明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回带指定名称的指定枚举类型的枚举常量。


package com.xindatai.ibs.lime;

public class Lime {
    public static void main(String[] args) {
        EnumTest test = EnumTest.TUE;
         
        //compareTo(E o)
        switch (test.compareTo(EnumTest.MON)) {
        case -1:
            System.out.println("TUE 在 MON 之前");
            break;
        case 1:
            System.out.println("TUE 在 MON 之后");
            break;
        default:
            System.out.println("TUE 与 MON 在同一位置");
            break;
        }
         
        //getDeclaringClass()
        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
         
        //name() 和  toString()
        System.out.println("name(): " + test.name());
        System.out.println("toString(): " + test.toString());
         
        //ordinal(), 返回值是从 0 开始
        System.out.println("ordinal(): " + test.ordinal());
    }
}  

Console : 


TUE 在 MON 之后
getDeclaringClass(): com.xindatai.ibs.lime.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1  

给 enum 自定义属性和方法

给 enum 对象加一下 value 的属性和 getValue() 的方法:

Class : EnumTest


package com.xindatai.ibs.lime;

public enum EnumTest {
    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
        @Override
        public boolean isRest() {
            return true;
        }
    },
    SUN(0) {
        @Override
        public boolean isRest() {
            return true;
        }
    };
 
    private int value;
 
    private EnumTest(int value) {
        this.value = value;
    }
 
    public int getValue() {
        return value;
    }
 
    public boolean isRest() {
        return false;
    }
}  

Class : Lime


package com.xindatai.ibs.lime;

public class Lime {
    public static void main(String[] args) {
        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
    }
}  

EnumSet,EnumMap 的应用


package com.xindatai.ibs.lime;

import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.Map.Entry;

public class Lime {
    public static void main(String[] args) {
        // EnumSet的使用
        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
        for (EnumTest day : weekSet) {
            System.out.println(day);
        }
 
        // EnumMap的使用
        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
        weekMap.put(EnumTest.MON, "星期一");
        weekMap.put(EnumTest.TUE, "星期二");
        // ... ...
        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry<EnumTest, String> entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }
    }
}  

原理分析

        enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:


package com.xindatai.ibs.lime;



public class com.xindatai.ibs.lime.EnumTest extends java.lang.Enum{
    public static final com.xindatai.ibs.lime.EnumTest MON;
    public static final com.xindatai.ibs.lime.EnumTest TUE;
    public static final com.xindatai.ibs.lime.EnumTest WED;
    public static final com.xindatai.ibs.lime.EnumTest THU;
    public static final com.xindatai.ibs.lime.EnumTest FRI;
    public static final com.xindatai.ibs.lime.EnumTest SAT;
    public static final com.xindatai.ibs.lime.EnumTest SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.xindatai.ibs.lime.EnumTest[] values();
    public static com.xindatai.ibs.lime.EnumTest valueOf(java.lang.String);
    com.xindatai.ibs.lime.EnumTest(java.lang.String, int, int, com.xindatai.ibs.lime.EnumTest);
}  

所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结

    可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

啦啦啦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java enum(枚举)使用详解 + 总结 的相关文章

随机推荐

  • 帧融合的功能(慢镜头的制作)

    转自 xff1a http mc2109 blog 163 com blog static 253694620087217213706 帧融合的功能 xff08 慢镜头的制作 xff09 2008 08 21 19 02 13 分类 xff
  • 无人驾驶二 卡尔曼滤波与PID控制

    链接 xff1a https pan baidu com s 108cN2yyKOiouiABXTYtGOw pwd 61 1234 提取码 xff1a 1234 卡尔曼滤波形象的描述见 xff1a 卡尔曼滤波原理及实现 曦爷的博客 CSD
  • JetsonTX2和TX2I的镜像备份与恢复及内核、DTB更新

    为了HDMI转CSI的图像采集模块能被识别 xff0c 可以成功采集HDMI视频图像 xff0c 最近在研究JetsonTX2和TX2I的刷机 镜像备份与恢复 xff0c 以及内核和DTB的刷入 按照https elinux org Jet
  • Dockerfile详解超全

    Dockerfile详解 环境介绍指令介绍FROMMAINTAINERLABELADDCOPYEXPOSEENV在Dockerfile中使用变量的方式 RUNCMDRUN amp amp CMDENTRYPOINTVOLUMEUSERWOR
  • c/c++调用libcurl库发送http请求的两种基本用法

    libcurl主要提供了两种发送http请求的方式 xff0c 分别是Easy interface方式和multi interface方式 xff0c 前者是采用阻塞的方式发送单条数据 xff0c 后者采用组合的方式可以一次性发送多条数据
  • ROS(二):读取摄像头图像节点并发布topic以及订阅

    读取树莓派摄像头信息发布到ROS话题中 摄像头为树莓派第二代摄像头 ros为kinetic版本 ubuntu系统 参考文档链接 http www ncnynl com archives 201611 1067 html http blog
  • 如何查看/确认linux是否能上网

    很多linux系统没有可视化界面 xff0c 无法通过界面访问一个外网的地址 xff08 比如 www baidu com 来确认是否能上网 在这种情况下 xff0c 确认linux服务器是不是能联网的方法很简单 xff0c 只需要ping
  • Ubuntu从源码编译LGSVL搭建环境

    上一周借助校园里面的教育网终于git clone成功了Apollo5 5的官方master repository xff0c 并build其gpu版本的模拟器 xff0c 根据最新的Apollo5 5 master文件描述 xff0c 桥接
  • #移动开发者大会#总结

    移动开发者大会 总结 xff08 有限的发言者 xff09 xff1a 李开复 xff1a 1 Android将在中国一骑绝尘 今年底中国将有4000万台Android手机 xff0c 2000万台iPhone 明年底总数会翻一倍 xff0
  • 河北金融学院赴京参加2011移动开发者大会有感

    记从被邀请到参加移动开发者大会的全过程 10月底 xff0c 突然接到潘永强老师的邀请 参加2011移动开发者大会 xff0c 当时我们真的很兴奋 xff0c 因为对于我们来说 xff0c 去北京是第一次 xff0c 去参加如此大型的会议更
  • 2011河北金融学院CSDN高校俱乐部动员大会

    2011年11月24日下午二点 xff0c 我校CSDN高校俱乐部动员大会在教学楼B123举行 该次大会主要针对大一学生召开 xff0c 号召大家了解并加入CSDN高校俱乐部 俱乐部指导老师王洪涛老师 计算机协会指导老师杜光辉老师 以及优秀
  • “激情与梦想 我的程序员之路”—2012高校巡讲

    2012年3月29日下午2点半 xff0c CSDN高校俱乐部项目主管潘永强老师在我校进行了一场以 激情与梦想 xff0c 我的程序员之路 为主题的演讲 信息管理与工程系团总支书记陈春燕 指导老师王洪涛以及杜光辉 刘冲等7位老师出席了该次讲
  • TX2下编译qt程序步骤

    1 将 aarch64 qt 5 15 1 tar bz2 解压到 opt 2 在 bashrc 添加qt的库和路进 art 64 art desktop opt cat bashrc tail n 2 export LD LIBRARY
  • 电子政务三网架构

    国家电子政务网络架构由政务内网 政务专网 政务外网组成 政务内网是涉密网络 xff0c 在上面传输涉密公文 xff0c 属高度机密的网络 xff0c 覆盖范围尽可能小 xff0c 它与国际互联网物理隔离 政务专网是党政机关非涉密办公网 xf
  • SDN介绍(什么是SDN)

    SDN介绍 一 xff0e 什么是SDN 二 xff0e SDN解决什么问题 xff1f 三 xff0e 传统网络概念和结构体系传统网络数据控制与转发 xff1a 传统网络架构 xff1a 四 xff0e SDN概述SDN xff08 So
  • 我的2011--快乐最重要

    呵呵 xff0c 听着郭德纲和于谦老师的相声 xff0c 开始写这篇文章 xff0c 刚毕业不到六个月 xff0c 就换了一份工作 xff0c 很多事情都在意料之外 xff0c 很多事情又在意料之中 xff0c 总之 xff0c 以后回忆到
  • 朱金灿:韧性、悟性、具备快速学习能力是我喜欢的特质

    英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台 通过线下线上的互动形式 xff0c 为CSDN社区专家提供更多学习 合作 宣传的机会 英雄会后续将在北上广深等国内一二线城市建立分会 xff0c 各个分会后期将组织技术交流活动
  • 本地vnc(TigerVNC)远程linux server,提示拒绝连接

    可能原因 amp 分析 xff1a 可确认下初始的系统环境变量是否被改动 xff0c 如新安装的anaconda自动添加到环境变量 xff0c 且放置在系统的原有环境变量的前面 xff0c 可尝试将后加的环境变量编辑到后面 xff0c 再重
  • 高质量嵌入式Linux C编程第一次博客作业

    1 xff1a linux 与 Unix的关系 xff1f 某些PC机的Unix和Linux在实现方面相类似 几乎所有的商业Unix版本都基本支持同样的软件 程序设计环境和网络特性 然而 xff0c Linux和Unix的商业版本依然存在许
  • java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration xff0c 是 JDK 1 5 中引入的新特性 xff0c 存放在 java lang 包中 下面是我在使用 enum 过程中的一些经验和总结 xff0c 主要包括如下内容 xff1a 1 原始的