还有你不知道的Java枚举特性(上篇)

你一定需要知道的高阶JAVA枚举特性! JAVA枚举,比你想象中还要有用! 我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值。 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。 当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。 后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。 让我们一起来看看Java中的一些高级枚举特性,以及如何利用这些特性使代码更简单、更可读。 枚举是类! 在J 阅读详情

简介

博文 Java 枚举的本质 跟大家一起学习了 Java 语言中枚举到底是什么,探索其本质和原理。用一句话来概括其本质就是:“Java 中的枚举是一个特殊的 Java 类”,有兴趣的同学可以点击了解上面那篇文章。

今天跟大家一起学习和总结一下 Java 中的枚举的其他特性和用途,由于内容较多,这次的分享分为两篇文章来写,欢迎大家拍砖、指正和交流!

本篇主要内容:

  • Java switch 语句支持枚举类型以及注意事项
  • Java 枚举的常量使用
  • 如何在自定义枚举中自定义成员变量和成员方法、静态方法
  • Java 枚举实现接口

下篇主要内容:

  • Java 枚举是一个特殊的类,聊聊其方法的重写
  • 如何使用接口来组织 Java 枚举?
  • JDK 数据结构中关于枚举的集合 EnumSet 和字典 EnumMap

switch 语句支持枚举

JDK1.5 才开始有枚举类型,同时可爱的 Java 组织丰富了 switch 语句,即支持枚举。

我们还是动手写个例子~

定义一个枚举 Color,示例如下:

public enum Color {
	RED("red color", 0), 
	GREEN("green color", 1),
	BLUE("blue color", 2), 
	YELLOW("yellow color", 3);
 
    // 构造方法
	Color(String name, int id) {
		_name = name;
		_id = id;
	}
 
	private String _name;
	private int _id;
 
	public String getName() {
		return _name;
	}
 
	public int getId() {
		return _id;
	}
 
	public static Color getColor(int max) {
		Random random = new Random(System.currentTimeMillis());
		int num = random.nextInt(max);
		switch (num) {
		case 0:
			return Color.RED;
		case 1:
			return Color.GREEN;
		case 2:
			return Color.BLUE;
		case 3:
			return Color.YELLOW;
		default:
			return Color.BLUE;
		}
	}
}

为枚举 Color 提供了一个静态方法 getColor,可以获取随机的颜色值。

那么,可以结合 switch 语句这样使用,示例代码如下:

public static void main(String[] args) {
	int len = Color.values().length;
	Color color = Color.getColor(len);
	switch (color) {
	case RED:
		System.out.println("select " + "RED");
		break;
	case GREEN:
		System.out.println("select " + "GREEN");
		break;
	case BLUE:
		System.out.println("select " + "BLUE");
		break;
	case YELLOW:
		System.out.println("select " + "YELLOW");
		break;
	default:
		System.out.println("select " + "unknow!!");
		break;
	}
}

可以看出,switch 语句中条件值是 Color 对象。

这里提醒大家要注意一个问题,如果 case 的条件带上类的名字,代码是无法通过编译的。如下面的代码(错误示例):

// Error
case Color.RED:
	System.out.println("select " + "RED");
    break;

编译的错误信息:

Error: An enum switch case label must be the unqualified name of an enumeration constant

即 switch case 语句结合枚举使用时,只能写枚举类定义的变量名称,不能加类名。

当常量使用

一般在 Java 中我们定义常量最常用的方式就是使用下面的方式,如下:

public static final int MAX_NAME_LENGTH = 0x1112;

有了枚举之后,也可以使用枚举来定义常量。

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

自定义方法、成员变量

上面的例子中自定义的一个枚举 Color,大家可以看到可以给它添加成员变量 _id、_name,构造方法和其他方法 getColor(静态方法)。

如果这部分很难理解,建议去阅读 Java 枚举的本质 这篇文章。

实现接口

所有的枚举类都继承自 Enum,因为 Java 不支持多继承,所以枚举无法继承其它类。

枚举既然是和 Java 的普通类基本一样,那么,枚举当然也可以实现接口。

下面是枚举 Color 实现接口 Paint 的例子,如下:

interface Paint {
        void setColor();
    }

public enum Color implements Paint {
    RED("red color"),
    GREEN("green color"),
    BLUE("blue color"),
    YELLOW("yellow color");

    Color(String name) {
        _name = name;
    }

    private String _name;

    @Override
    public void setColor() {
        System.out.println("Current paint color: " + _name);
    }
}

还可以采用匿名内部类的方式,让每个枚举值实现接口 Paint 的方法,示例如下:

public enum Color implements Paint {
        RED("red color") {
            @Override
            public void setColor() {
                System.out.println("Current paint color: " + RED._name);
            }
        },
        GREEN("green color") {
            @Override
            public void setColor() {
                System.out.println("Current paint color: " + GREEN._name);
            }
        },
        BLUE("blue color") {
            @Override
            public void setColor() {
                System.out.println("Current paint color: " + BLUE._name);
            }
        },
        YELLOW("yellow color") {
            @Override
            public void setColor() {
                System.out.println("Current paint color: " + YELLOW._name);
            }
        };

        Color(String name) {
            _name = name;
        }

        private String _name;

        @Override
        public void setColor() {
            System.out.println("Current paint color: " + _name);
        }
}

可以写个方法测试一下,如下:

public static void main(String[] args) {
    for (Color color : Color.values()) {
        color.setColor();
    }
}

输出结果,如下:

Current paint color: red color
Current paint color: green color
Current paint color: blue color
Current paint color: yellow color

人生没有永远的赢家,切勿大喜大悲,要以平常心对待一切~
在这里插入图片描述

你所不知道的枚举(flag)? 一直以为自己很了解枚举,用起来很顺手,但发现自己知道的只是一部分,枚举原来还可以这么玩,与flag关联做逻辑操作。 这里主要说的是C#中的内容。 阅读详情

相关推荐

JAVA的枚举

本例和上例的执行结果完全相同。

2301_78297748的博客 2139

Java枚举详解

如上文所述,枚举可以直接定义方法,就像在任何类中一样。

2301_81298401的博客 3575

【第60题】必学的枚举1-枚举的定义和基本特性

枚举

小虚竹的专栏 4万+

在java中关于枚举类型的特性_java枚举类型小结

JDK5.0之前,我们一般选择使用 interface 来保存常量组,以此来弥补 JDK 中没有枚举类型的缺陷,从JDK5.0开始,Sun引进了一个全新的关键字 enum 来定义一个枚举类。同interface相比,enum 在功能上更为专业和强大。先上个例子:package com.darkmi.basic;enum Color{DARK, RED, BLUE;}public class Enu...

weixin_35879989的博客 476

ENVI5.6 自动化流程:GF系列卫星影像批处理与质量优化

本文详细介绍了如何利用ENVI5.6构建针对GF-2、GF-6、GF-7系列卫星影像的自动化批处理流水线。通过配置Batch Processing工具,实现从正射校正到图像融合的全流程批量处理,并分享参数设置、质量监控与故障排查的实战经验,旨在显著提升海量遥感影像的处理效率与成果质量。

efc1234567的博客 604

告别配置噩梦:用Vcpkg三行命令为Easy3D自动安装Boost、CGAL和Qt(VS2022实测)

本文详细介绍了如何使用Vcpkg工具在VS2022环境下为Easy3D项目一键安装Boost、CGAL和Qt等依赖库,解决传统手动配置的复杂性问题。通过三行简单命令即可自动完成下载、编译和路径配置,大幅提升开发效率,特别适合C++开发者快速搭建3D图形开发环境。

weixin_42525582的博客 212

JAVA之枚举Enum

一、什么是枚举? 二、枚举的一些关键特性 三、枚举使用场景 四、枚举与常量类 五、枚举与普通类 六、枚举与数据库 七、单个参数示例:(类似普通类中得构造参数) 八、多个参数:(类似普通类中得构造参数) 九、异常处理应用 十、高级操作 十一、枚举上使用注解

weixin_38959316的博客 7890

【天线与电波传播】电波传播部分 第7章 电波传播的基础知识3

菲涅尔区与菲涅尔带的基本知识

Chen59_2328的博客 1602

Java之 枚举

1.1实际上枚举就是一种高级的多例设计模式。 eg:基于枚举开发 enum Color { RED,GREEN,BLUE } public class TestDemo { public static void main(String[] args) { System.out.println(Color.BLUE); ...

C_U_N_Z的博客 323

半导体设备隔振必看:如何用天棚阻尼PID控制实现VC-C级振动抑制(含SIMULINK模型)

本文深入探讨了在半导体精密制造中,如何运用天棚阻尼PID控制算法实现VC-C级振动抑制。通过构建高保真单自由度仿真模型,详细解析了从算法原理、SIMULINK实现到参数整定的全链路方案,并针对谐波扰动提供了陷波滤波器设计方法,为工程师提供了从仿真到实践的完整主动隔振技术指南。

pz89012345的博客 541

Qt:一个强大而灵活的跨平台应用程序开发框架

代码示例中的源代码是简单的示例,用于演示Qt框架的一些基本特性。实际应用中,开发人员可以根据自己的需求和项目要求,使用Qt框架提供的丰富功能和组件进行开发。在Qt的官方文档和示例代码中,您可以找到更多详细的教程和示例,以帮助您更好地理解和使用Qt框架。它提供了丰富的工具和功能,支持跨多个平台进行开发,并具有高度的可定制性和灵活性。它提供了丰富的工具和功能,使得开发人员能够创建高性能、可扩展和易于维护的应用程序。下面将详细介绍Qt框架的优点,并提供一些相关的源代码示例。

CodeVorter的博客 870

Java 枚举7个特性

**在JDK1.5 之前,我们定义常量都是: public static final… 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 ** 自定义枚举 package cn.itcast.test; /** * 自定义枚举方法 * * @author cjj * @date 2018年9月28日 * @email 729165621...

天下没有难写的代码 3712

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2463

还有你不知道的Java枚举特性(下篇)

简介 这篇是博文 还有你不知道的Java枚举特性(上篇) 的下篇,可以点击下面的链接前往。 本篇主要内容: Java 枚举是一个特殊的类,聊聊其方法的重写 如何使用接口来组织 Java 枚举? 如何使用枚举实现 Java 的单例模式 JDK 数据结构中关于枚举的集合 EnumSet 和字典 EnumMap 重写枚举的方法 所有的枚举类都继承自 Enum,在这个父类当中 toString、equ...

CodingMan 744

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7172

Windows远程桌面开发之九-虚拟显示器(Windows 10 Indirect Display 虚拟显示器驱动开发)

by fanxiushu 2019-06-24 转载或引用请注明原始作者。 这里与远程桌面关系不是太大,但这个部分是xdisp_virt远程控制程序的实现多显示器桌面扩展的子功能,因此也归为远程桌面开发一类。 这篇文章与之前发布的...

fanxiushu的专栏 2万+

枚举类都不知道,还敢说自己会Java?

本文主要针对面试中经常被问到的枚举类的热点、难点由浅入深进行深入分析

Mr_wxc的博客 6249

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java枚举的特点_你一定需要知道的高阶JAVA枚举特性!

JAVA枚举,比你想象中还要有用!我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值。在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。让我...

weixin_35740875的博客 143

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java枚举1.8,你一定需要知道的高阶JAVA枚举特性!

JAVA枚举,比你想象中功能还要强大!我经常发现自己在Java中使用枚举来表示某个对象的一组值。在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。让...

weixin_28851191的博客 430

数学建模模型总结

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

java enum 性能,你一定需要知道的高阶JAVA枚举特性!

JAVA枚举,比你想象中还要有用!我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值。在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。让我...

weixin_42116921的博客 378

java定义枚举并赋值_java中枚举的特性是什么?如何赋值?

上次已经为大家介绍过java枚举的概念是什么的主要内容了。今天再来为大家介绍一些相关的知识,也是关于java枚举的一些内容,也就是它的特性以及如何赋值,一起来了解一下吧。首先说一下,java中枚举的特性是什么?枚举的特性,归结起来就是一句话:除了不能继承,基本上可以将enum看做一个常规的类。但是这句话需要拆分去理解。1.我们都知道,枚举是可以添加方法的,枚举值默认为从0开始的有序数值 。那么问题...

weixin_32821643的博客 3599

枚举概念与特性

enum 全称为 enumeration, 是 JDK 1.5 中引入的新特性,通过关键字enum来定义枚举类

zhuge_long的专栏 1378

3 枚举怎么船只_你一定需要知道的高阶JAVA枚举特性!

JAVA枚举,比你想象中功能还要强大!我经常发现自己在Java中使用枚举来表示某个对象的一组值。在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能...

weixin_28894541的博客 78

java——枚举

本例和上例的执行结果完全相同。

zjx1415926的博客 1318

初探Java枚举类

目录1.何为枚举2.枚举本质3.枚举特性3.1基本特性3.2枚举方法3.3 枚举接口3.4 获取枚举元素3.5 状态机4.枚举工具类4.1EnumSet4.2EnumMap5.总结 1.何为枚举 枚举是一种数据类型,具有集合的一些特点,可以存放多个元素,但存储对象有限且固定,枚举也有比较常见的使用场景。如性别(男、女),颜色(红、黄、蓝),星期(星期一、星期二…星期日)均可以使用枚举存储。 2.枚举本质 从源码角度: public abstract class Enum<E extends Enum

增量星球 1710
上一篇: 微服务: 学习几个容易混淆的URL注解
下一篇: 跳绳的故事
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值