学习枚举

枚举

引入

编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter)

概念

枚举(enum)全称为 enumeration, 是 JDK 1.5 中引入的新特性。

语法

public enum Color{//默认添加 public static finalRED,GREEN,BLUE;
}

本质

尽管枚举看起来像是一种新的数据类型,实际上,枚举就是一种受限制的类,并且具有自己的方法。创建自己的enum类时,这个类继承自 java.lang.Enum。

    public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable{...
}

特点

  • 枚举就是一个受限制的类,默认继承Enum

  • 枚举的第一行必须定义该枚举类型的对象

  • 枚举类型对象默认添加: public static final 类型

  • 枚举没有继承明确类(自定义枚举类默认继承Enum,Enum默认继承Object)

  • 枚举类不能被继承

  • 枚举里可以有构造方法、成员方法、静态方法、抽象方法

  • 枚举可以实现接口

  • 枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加

优势

  • 增强代码可读性

  • 枚举型可直接与数据库交互

  • switch语句优势

  • 编译优势

(枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类 )

  • 将常量组织起来,统一管理

  • 去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高

枚举的方法

方法名解释
Enum.valueOf(Class<E> enumType, String name)根据字符串找到该枚举类中的对象
public static void values()获取该枚举类对象数组
public static void valueOf(String args0)根据字符串获取该枚举类中的对象
public final String name()获取该枚举对象名字
public final Class<E> getDeclaringClass()获取枚举对象的枚举类型相对应的Class对象
public final int hashCode()获取该枚举对象的hash值
public final int compareTo(E o)两个枚举对象进行比较
public final boolean equals(Object other)比较两个枚举对象是否相同

枚举案例 - 状态机

enum Signal{RED, YELLOW, GREEN}
​
public class EnumTest {
​public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请输入信号灯:RED,YELLOW,GREEN");Signal signal = Signal.valueOf(scan.next());String instruct = getTrafficInstruct(signal);System.out.println(instruct);scan.close();}
​public static String getTrafficInstruct(Signal signal) {String instruct = "信号灯故障";switch (signal) {case RED:instruct = "红灯停";break;case YELLOW:instruct = "黄灯请注意";break;case GREEN:instruct = "绿灯行";break;default:break;}return instruct;}
}

枚举案例 - 错误码

public enum ErrorCodeEn {Ok(1,"成功"),ERROR_A(2,"错误A"),ERROR_B(3,"错误B");private int code;//状态码private String description;//状态信息ErrorCodeEn(){}ErrorCodeEn(int code,String description){this.code = code;this.description = description;}
​public int getCode() {return code;}
​public String getDescription() {return description;}
}

枚举案例 - 组织枚举

含义:可以将类型相近的枚举通过接口或类组织起来(但是一般用接口方式进行组织)

原因是:

Java接口在编译时会自动为enum类型加上public static修饰符;

Java类在编译时会自动为 enum 类型加上static修饰符;

就是说,在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。

public interface IErrorCode {
​enum LoginErrorCodeEn implements INumberEnum{
​OK(1,"登录成功"),ERROR_A(-1,"验证码错误"),ERROR_B(-2,"密码错误"),ERROR_C(-3,"用户已登录");
​private int code;private String description;
​LoginErrorCodeEn(int code,String description){this.code = code;this.description = description;}
​@Overridepublic int getCode() {return code;}@Overridepublic String getDescription() {return description;}}
​enum RigsterErrorCodeEn implements INumberEnum{
​OK(1,"注册成功"),ERROR_A(-1,"账号已存在");
​private int code;private String description;
​RigsterErrorCodeEn(int code,String description){this.code = code;this.description = description;}
​@Overridepublic int getCode() {return code;}@Overridepublic String getDescription() {return description;}}
​
}
​
interface INumberEnum {int getCode();String getDescription();
}

枚举案例 - 策略枚举

优点:这种枚举通过枚举嵌套枚举的方式,将枚举常量分类处理。

这种做法虽然没有switch语句简洁,但是更加安全、灵活。

public enum Salary {JAVA(SalaryType.TEACHER),HTML(SalaryType.TEACHER),PYTHON(SalaryType.TEACHER),PRINCIPAL(SalaryType.ADMINISTRATION);//校长private final SalaryType salaryType;Salary(SalaryType salaryType){this.salaryType = salaryType;}//baseSalary-底薪 classHour-课时 teachingHourSubsidy-课时费 achievements-绩效double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements){return salaryType.getSalary(baseSalary, classHour, teachingHourSubsidy, achievements);}//策略枚举private enum SalaryType {TEACHER {//老师@Overridedouble getSalary(double baseSalary, int classHour, double teachingHourSubsidy,double achievements) {return baseSalary + classHour*teachingHourSubsidy + achievements;}},ADMINISTRATION {//行政人员@Overridedouble getSalary(double baseSalary, int classHour, double teachingHourSubsidy,double achievements) {return baseSalary + achievements;}};abstract double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements);}
}

枚举工具类 - EnumSet 和 EnumMap

Java 中提供了两个方便操作enum的工具类——EnumSet 和 EnumMap。

EnumSet :枚举类型的高性能 Set实现。它要求放入它的枚举常量必须属于同一枚举类型。 EnumMap :专门为枚举类型量身定做的 Map 实现。虽然使用其它的 Map 实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用 EnumMap 会更加高效,因为它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值。这使得 EnumMap 的效率非常高。

public class EnumTest {public static void main(String[] args) {//EnumSet的使用//把Signal枚举中所有对象抽取到Set集合中EnumSet<Signal> signalSet = EnumSet.allOf(Signal.class);for (Enum<Signal> en : signalSet) {System.out.println(en);}//EnumMap的使用EnumMap<Signal,Object> enumMap = new EnumMap<>(Signal.class);enumMap.put(Signal.RED, "红灯");enumMap.put(Signal.YELLOW, "黄灯");enumMap.put(Signal.GREEN, "绿灯");//把所有的映射关系对象抽取到Set集合中Set<Entry<Signal, Object>> entrySet = enumMap.entrySet();for (Entry<Signal, Object> entry : entrySet) {Signal key = entry.getKey();Object value = entry.getValue();System.out.println(key + " -- " + value);}}
}
enum Signal{RED, YELLOW, GREEN}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Find Yourself

前言 2月份&#xff0c;真是发生了很多事情啊。 离职&#xff0c;放假&#xff0c;瞒着家人&#xff0c;过春节&#xff0c;陪女儿玩游戏&#xff0c;找工作&#xff0c;选择Offer。 也和别人一起解决了一个设备不稳定的重大问题。 每一项展开讲讲都能写一篇文章。 如果你感…

手机和windows的便签怎么共享账号使用

在忙碌的生活中&#xff0c;我经常需要在手机和电脑之间同步记事信息。可是&#xff0c;每次当我在手机上记下一些重要事项后&#xff0c;想要在电脑上查看或继续编辑时&#xff0c;总是遇到各种麻烦。因为手机和电脑上的便签软件各不相同&#xff0c;无法实现账号共享和内容同…

从0到1实现五子棋游戏!!

Hello&#xff0c;好久不见宝子们&#xff0c;今天来给大家更一个五子棋的程序~ 我们今天要讲的内容如下&#xff1a; 文章目录 1.五子棋游戏介绍1.1 游戏玩法介绍&#xff1a; 2.准备工作2.1 具体操作流程 3.游戏程序主函数4.初始化棋盘4.1.定义宏变量4.2 初始化棋盘 5.打印…

2024年2月最新微信域名检测拦截接口源码

这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList&#xff0c;然后遍历该数组&#xff0c;对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下&#xff1a; 1. 定义待检测的域名列表。 2. 遍历域名…

一、深度学习介绍

目录 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景

rust连接postgresql数据库

同步操作 引入crate&#xff1a; postgres "0.19.7" use postgres::{Client, NoTls, error::Error};fn main() -> Result<(), Error> {let mut client Client::connect("hostlocalhost port5432 dbnamexxxxxdb userpostgres password123456"…

优化全球应用交付,详解GLSB是什么?

伴随着互联网的快速发展&#xff0c;网站的流量请求甚至能达到上千亿&#xff0c;越来越多的用户不满足于在单一数据中心提供服务&#xff0c;开始考虑容灾、用户就近访问以及全球应用交付等问题。在这样的需求下&#xff0c;全局服务器负载均衡技术&#xff08;GSLB&#xff0…

Linux笔记--基本操作指令

一、查看日期与日历 1.date指令 显示日期 #用法1:dateCST: China Standard Time时区&#xff0c;中国标准时间 #用法2: date 指定格式 [常用格式]: "%Y-%m-%d"(%F): 2022-07-25 "%H:%M:%S"(%T): 14:53:44 "%F %T" #用法3: date -d "-1 da…

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容&#xff1a; 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

智慧应急与物联网相结合:物联网技术如何提升智慧应急响应能力

目录 一、引言 二、智慧应急与物联网技术的结合 三、物联网技术提升智慧应急响应能力的途径 四、物联网技术在智慧应急中的应用案例 五、物联网技术在智慧应急中面临的挑战与解决方案 挑战一&#xff1a;技术标准与规范不统一 解决方案&#xff1a; 挑战二&#xff1a;…

工业锅炉物联网:HiWoo Cloud为工业能源转型注入新动力

随着全球工业化的快速发展&#xff0c;工业锅炉作为工业生产的“心脏”&#xff0c;其能源效率和运行安全性越来越受到关注。然而&#xff0c;传统的工业锅炉管理往往依赖于人工监控和定期维护&#xff0c;这种方式不仅效率低下&#xff0c;而且难以确保设备的持续高效运行。在…

Matlab如何批量读取txt数据?科研效率UpUp第1期

最近帮几个亲朋好友整理博士毕业论文。 期间&#xff0c;我观察了他们的行为模式&#xff0c;发现其将大量的时间&#xff0c;不同程度地浪费在一些机械、重复性劳动上&#xff0c;导致效率低下。 博士尚且如此&#xff0c;想必还有很多人也深受其扰。 作为一个专业摸鱼人&a…

分享:大数据信用报告查询的价格一般要多少钱?

现在很多人都开始了解自己的大数据信用了&#xff0c;纷纷去查大数据信用报告&#xff0c;由于大数据信用与人行征信有本质的区别&#xff0c;查询方式和价格都不是固定的&#xff0c;本文就为大家详细讲讲大数据信用报告查询的价格一般要多少钱&#xff0c;希望对你有帮助。 大…

MySql-索引失效的情况

1.模糊查询时%在开头 当使用模糊查询&#xff08;如使用 LIKE %keyword%&#xff09;时&#xff0c;如果通配符 % 出现在搜索关键字的开头&#xff0c;那么索引将无法被有效利用&#xff0c;从而导致索引失效。 当通配符出现在搜索关键字的开头时&#xff0c;索引失效的主要原…

如何用golang写一个自己的后端框架

如果你想要不使用任何现有的后端框架,完全从头开始创建一个后端框架,你需要实现Web服务器的基本组件,比如路由器、请求处理、中间件支持等。以下是一个简单的指南,用于创建一个基本的、不使用任何外部框架的Go后端框架。 步骤 1: 设置工作环境 确保你已经安装了Go语言环境…

vue3 实现一个简单的输入框

需求背景 需要一个输入框&#xff0c;可以输入文字&#xff0c;添加表情&#xff0c;一开始用了富文本编辑器&#xff0c;有点大材小用&#xff0c;所以自己封装一个输入框组件。支持输入文字&#xff0c;选择表情/插入表情&#xff0c;支持组合键换行&#xff0c;使用enter 进…

模块化学习

CommonJS 全局变量污染依赖混乱 模块化的标准&#xff1a; CommonJS CMJ 社区标准 node环境ES Module ESM 官方标准 CMJ规范&#xff1a; 所有的 js 文件都是一个模块 运行的模块 入口模块所有的模块中的全局变量、函数&#xff0c;均不会产生污染当一个模块需要提供一些东西给…

Python Web详细教程

Python Web开发的详细教程可以分为以下几个步骤&#xff1a; 1. 环境搭建 安装Python&#xff1a;确保你的系统上安装了Python。你可以从Python官网下载并安装最新版本的Python。 安装虚拟环境&#xff1a;为了隔离项目依赖&#xff0c;建议使用虚拟环境。你可以使用venv模块创…

DPU:未来计算的三大支柱之一

随着计算领域的不断发展&#xff0c;数据处理单元&#xff08;DPU&#xff09;的出现正在重塑数据中心和计算架构的未来。在本文中&#xff0c;我们深入探讨了DPU在该领域的重要性和作用&#xff0c;并将其与传统的中央处理器&#xff08;CPU&#xff09;和图形处理单元&#x…

2024年小程序云开发CMS内容管理无法使用,无法同步内容模型到云开发数据库的解决方案,回退老版本CMS内容管理的最新方法

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…