Java enum的用法详解

C语言枚举类型(enum)的各种用法 枚举enum就是英文enumerate的缩写,也就是列举、排列说明的意思。枚举类型是C语言中的一种特殊类型,枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围。 阅读详情
用法一:常量


在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。


public enum Color {  
  RED, GREEN, BLANK, YELLOW  
} 
 


用法二:switch


JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。


复制代码
enum Signal {
        GREEN, YELLOW, RED
    }


    public class TrafficLight {
        Signal color = Signal.RED;


        public void change() {
            switch (color) {
            case RED:
                color = Signal.GREEN;
                break;
            case YELLOW:
                color = Signal.RED;
                break;
            case GREEN:
                color = Signal.YELLOW;
                break;
            }
        }
    }
复制代码
用法三:向枚举中添加新方法


如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。


复制代码
public enum Color {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;


        // 构造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }


        // 普通方法
        public static String getName(int index) {
            for (Color c : Color.values()) {
                if (c.getIndex() == index) {
                    return c.name;
                }
            }
            return null;
        }


        // get set 方法
        public String getName() {
            return name;
        }


        public void setName(String name) {
            this.name = name;
        }


        public int getIndex() {
            return index;
        }


        public void setIndex(int index) {
            this.index = index;
        }
    }
复制代码
用法四:覆盖枚举的方法


下面给出一个toString()方法覆盖的例子。


复制代码
public class Test {
    public enum Color {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;


        // 构造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }


        // 覆盖方法
        @Override
        public String toString() {
            return this.index + "_" + this.name;
        }
    }


    public static void main(String[] args) {
        System.out.println(Color.RED.toString());
    }
}
复制代码
用法五:实现接口


所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。


复制代码
public interface Behaviour {
        void print();


        String getInfo();
    }


    public enum Color implements Behaviour {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;


        // 构造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }


        // 接口方法


        @Override
        public String getInfo() {
            return this.name;
        }


        // 接口方法
        @Override
        public void print() {
            System.out.println(this.index + ":" + this.name);
        }
    }
复制代码
用法六:使用接口组织枚举


复制代码
public interface Food {
        enum Coffee implements Food {
            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
        }


        enum Dessert implements Food {
            FRUIT, CAKE, GELATO
        }
    }
复制代码
用法七:关于枚举集合的使用


java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档


 


枚举和常量定义的区别


一、 通常定义常量方法


我们通常利用public final static方法定义的代码如下,分别用1表示红灯,3表示绿灯,2表示黄灯。


复制代码
public class Light {
        /* 红灯 */
        public final static int RED = 1;


        /* 绿灯 */
        public final static int GREEN = 3;


        /* 黄灯 */
        public final static int YELLOW = 2;
    }
复制代码
二、 枚举类型定义常量方法


枚举类型的简单定义方法如下,我们似乎没办法定义每个枚举类型的值。比如我们定义红灯、绿灯和黄灯的代码可能如下:


public enum Light {
        RED, GREEN, YELLOW;
    }
我们只能够表示出红灯、绿灯和黄灯,但是具体的值我们没办法表示出来。别急,既然枚举类型提供了构造函数,我们可以通过构造函数和覆写toString方法来实现。首先给Light枚举类型增加构造方法,然后每个枚举类型的值通过构造函数传入对应的参数,同时覆写toString方法,在该方法中返回从构造函数中传入的参数,改造后的代码如下:


复制代码
public enum Light {


    // 利用构造函数传参
    RED(1), GREEN(3), YELLOW(2);


    // 定义私有变量
    private int nCode;


    // 构造函数,枚举类型只能为私有
    private Light(int _nCode) {


        this.nCode = _nCode;


    }


    @Override
    public String toString() {


        return String.valueOf(this.nCode);


    }


}
复制代码
三、 完整示例代码


枚举类型的完整演示代码如下:


复制代码
public class LightTest {


    // 1.定义枚举类型


    public enum Light {


        // 利用构造函数传参


        RED(1), GREEN(3), YELLOW(2);


        // 定义私有变量


        private int nCode;


        // 构造函数,枚举类型只能为私有


        private Light(int _nCode) {


            this.nCode = _nCode;


        }


        @Override
        public String toString() {


            return String.valueOf(this.nCode);


        }


    }


    /**
     * 
     * @param args
     */


    public static void main(String[] args) {


        // 1.遍历枚举类型


        System.out.println("演示枚举类型的遍历 ......");


        testTraversalEnum();


        // 2.演示EnumMap对象的使用


        System.out.println("演示EnmuMap对象的使用和遍历.....");


        testEnumMap();


        // 3.演示EnmuSet的使用


        System.out.println("演示EnmuSet对象的使用和遍历.....");


        testEnumSet();


    }


    /**
     * 
     * 演示枚举类型的遍历
     */


    private static void testTraversalEnum() {


        Light[] allLight = Light.values();


        for (Light aLight : allLight) {


            System.out.println("当前灯name:" + aLight.name());


            System.out.println("当前灯ordinal:" + aLight.ordinal());


            System.out.println("当前灯:" + aLight);


        }


    }


    /**
     * 
     * 演示EnumMap的使用,EnumMap跟HashMap的使用差不多,只不过key要是枚举类型
     */


    private static void testEnumMap() {


        // 1.演示定义EnumMap对象,EnumMap对象的构造函数需要参数传入,默认是key的类的类型


        EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(


        Light.class);


        currEnumMap.put(Light.RED, "红灯");


        currEnumMap.put(Light.GREEN, "绿灯");


        currEnumMap.put(Light.YELLOW, "黄灯");


        // 2.遍历对象


        for (Light aLight : Light.values()) {


            System.out.println("[key=" + aLight.name() + ",value="


            + currEnumMap.get(aLight) + "]");


        }


    }


    /**
     * 
     * 演示EnumSet如何使用,EnumSet是一个抽象类,获取一个类型的枚举类型内容<BR/>
     * 
     * 可以使用allOf方法
     */


    private static void testEnumSet() {


        EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);


        for (Light aLightSetElement : currEnumSet) {


            System.out.println("当前EnumSet中数据为:" + aLightSetElement);


        }


    }


}
复制代码
执行结果如下:


演示枚举类型的遍历 ......


当前灯name:RED


当前灯ordinal:0


当前灯:1


当前灯name:GREEN


当前灯ordinal:1


当前灯:3


当前灯name:YELLOW


当前灯ordinal:2


当前灯:2


演示EnmuMap对象的使用和遍历.....


[key=RED,value=红灯]


[key=GREEN,value=绿灯]


[key=YELLOW,value=黄灯]


演示EnmuSet对象的使用和遍历.....


当前EnumSet中数据为:1


当前EnumSet中数据为:3


当前EnumSet中数据为:2


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


以下内容可能有些无聊,但绝对值得一窥


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多路分发
枚举(enum)的用法及代码讲解 上述代码实现了以下逻辑:1. **识别经济区**: 通过检查收件省份和发件省份是否都属于同一个经济区,来确定它们是否在同一区域内互寄。2. **查询运费模板**: 如果找到了匹配的经济区,就根据运费模板类型、运输类型,以及关联的城市信息,查询是否存在对应的运费模板。通过这种方式,系统可以确保在处理运费计算时,考虑到经济区之间的互寄场景,选择正确的运费模板来处理运费的计算和应用。 阅读详情

相关推荐

枚举使用方法

在百科 中           ENUM(编程语言中的一种数据类型)编辑 enum是计算机编程语言中的一种数据类型。枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说

张旺华的博客 1982

C语言丨关键字enum用法详解,看这篇就够了

一、关键字enum的定义 enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值, 我们可以将枚举理解为编译阶段的宏,使用格式: enum typeName { valueName1, valueName2, valueName3, ...... }; typeName是枚举类型的名字,花括号里面的元素(

Hsuesh的博客 3万+

PTGui使用教程

PTGui使用教程为啥使用ptgui开始使用ptgui 为啥使用ptgui ptgui是一个全景拼接软件,在海思hi3559上做视频拼接的时候,需要拼接参数,这是就需要使用到ptgui,这里可以在该网站下下载ptgui:下载地址 开始使用ptgui 第一步,加载图片,我这里添加了三幅图 然后添加控制点(可以先多对准几次图像,这样会自动生成一些控制点,但是不保证准确),建议控制点不要太密集 点开镜头设置,勾选以下几个选项以及配置好镜头类型,如下图 点开优化器,在高级界面中配置如下参数,最后点

what_wrong的博客 1万+

JAVA ENUM的用法详解

今天在看 java enum帖子的时候,发现一个总结的很全的,具体网址:https://www.cnblogs.com/liaojie970/p/6474733.html 现在将其具体内容复制下来,以便自己学习,同时希望对大家也有帮助 Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。 因此,在比较两个枚举类型的值时,永远不需要调用equals方法

qianbihua00的博客 440

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

RH850_U2A系列HSM安全核开启但是固件未烧录导致无法启动也无法再烧入固件废板问题分析解决

hsm核导致的安全锁死补救方案

u011941262的博客 1734

java enum的用法详解

java enum的用法详解 今天在看 java enum帖子的时候,发现一个总结的很全的,具体网址:https://www.cnblogs.com/liaojie970/p/6474733.html 现在将其具体内容复制下来,以便自己学习,同时希望对大家也有帮助 Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_...

weixin_30401605的博客 102

Light Tools 8.4 在 win10系统上的安装方法(64位)

** 总的来说安装LT需要以下步骤(折腾了三天终于装好): 安装LT软件–禁用签名–加载含数字签名的第三方inf–添加注册表/安装驱动/添加密钥–成功破解 一、下载对应的LightTools 8.4版本软件,如下图为解压后的文件: 并选择 进行默认安装。 二、禁用数字签名。这里我用了两种方法,一种不行就换另一种,最终成功禁用。 方法1: 1、输入“cmd”并以管理员身份运行; 2、输入或复制 bcdedit.exe /set nointegritychecks on (此命令若没成功,再试bcded

weixin_45560953的博客 1万+

java enum使用_java enum用法详解

我们都知道,enum是java的一个语法糖,实际编译后的文件仍然是一个java类,今天我们就拨开语法糖的外衣,看一看原始的java类应该是什么样的。首先写一个enum类:enum Color {RED,YELLOW,BLUE}这样简单的枚举类它的基本用法就是:打印,判断相等,和switch:package aaa;public class User2 {public static void mai...

weixin_39560657的博客 257

【Linux】Petalinux使用QSPI FLASH引导启动

1. 预分配Flash空间使用Flash引导Petalinux做的系统,也有进阶的做法。部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。1. 预分配Flash空间根据生成的bit文件大小估算BOOT.BIN文件的大小,为Flash大概分配四个分区:boot、bootenv、kernel、bootscr,分别存放BOOT.BIN文件、u-boot的环境变量、内核文件(image.ub/zImage/uImage等)、启动脚本boot.scr。

Tesseract_9527的博客 3375

4.2 多智能体系统的严格隔离机制:防止上下文污染与隐私数据脱敏实战

本文探讨了多智能体系统中上下文信息共享带来的安全风险与解决方案。研究发现,随着Agent数量增加,上下文信息泄露概率呈指数级上升,可能导致跨Agent错误传播、隐私泄露等问题。文章提出分层隔离架构,将上下文划分为全局共享和本地私有两部分,并通过命名空间隔离、递归压缩和隐私过滤技术确保数据安全。技术实现上,建议为每个子Agent创建独立状态空间,采用原子化更新和读写锁控制避免状态竞争。隐私保护方面,结合正则匹配和命名实体识别技术进行敏感数据过滤,确保符合GDPR等法规要求。这些措施共同构建了可靠、安全且合规的

公众号:AI前沿侦探 225

java enum的用法详解

Java Enum原理  public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。 因此,在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了。(equals()方法也是直接使用==,  两者是一样的效果) Java Enum

流浪的虾壳 1万+

浏览器主页被2345劫持简单处理方法

本人比较常用的浏览器是IE和Chrome IE: 将网址修改为https://www.baidu.com 应用-确定-重新打开IE浏览器 或者win+r运行regedit打开注册表找到这个值   HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下  和HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main这个下面的StartPage ...

A soul tortured by desire 2万+

java枚举enum的用法详解

个人觉得看到“用法三”就够用了,所以只节选了原博客的部分。 原博客地址:https://www.cnblogs.com/liaojie970/p/6474733.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Java Enum原理 public ...

HD243608836的博客 328

金融监管压力测试场景生成

压力测试是一种评估金融资产或机构在极端市场条件下的表现和风险承受能力的方法。它通过模拟各种不利的市场情景,测试金融机构在这些情景下的财务状况和运营能力。压力测试的作用在于帮助金融机构识别潜在风险,评估应对策略,并制定应急预案。总结压力测试场景生成系统的开发过程和实现效果,强调其在金融监管中的重要性和应用价值。随着金融市场的发展,实时压力测试将越来越重要。未来,压力测试需要更加注重实时性和动态性,及时反映市场的变化。本文详细介绍了金融监管压力测试的重要性、核心概念、算法原理、系统架构以及实战案例。

AI天才研究院 1208

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 枚举(enum) 详解常见的用法

一、枚举型常量 package com.yang; //首先枚举是一个特殊的class //这个class相当于final static修饰,不能被继承 //他的构造方法强制被私有化,下面有一个默认的构造方法private ColorEnum(); //所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类 public enum ColorEn...

科比粉丝的博客 730

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 枚举(enum) 详解五种常见的用法

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java 枚举(enum) 详解五种常见的用法 一、枚举型常量 package com.yang; //首先枚举是一个特殊的class //这个class相当于final static修饰,不能被继承 //他的构造方法强制被私有化,下面有一个默认的构造方法...

基督山伯爵的博客 7万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: java中的代码块理解
下一篇: DOS命令大全(经典收藏)
HackProgramer
博客等级 码龄12年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值