【Java SE】枚举类

ops/2024/11/13 3:35:52/

枚举(enumeration,简写为 enum)是一种特殊的类,用于表示一组有限的常量。它包含一组特定的、固定的对象。例如,表示季节时,我们可以定义一个枚举来表示春天、夏天、秋天和冬天。如果直接用类来实现季节,可能会出现不合理的情况,比如可以创建一个名字不符的实例,或者随意修改季节的名称,这显然不符合实际情况。因此,使用枚举可以有效解决这些问题。在 Java 中,常见的枚举实现方式有两种:一种是自定义类,另一种是使用 enum 关键字。使用 enum 关键字可以更简洁、更安全地定义常量集合,并限制只能使用预定义的值。

一、自定义类

在使用自定义类实现枚举时,可以先定义一个 Season 类,并在该类中添加一个 name 属性,用于表示季节的名称。同时,我们还需要提供构造方法以及 getter 和 setter 方法来访问和修改这个属性。以下是示例代码:

java">class Season {private String name;public Season(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

然而,通过分析季节的需求,我们发现之前的类定义无法满足固定取值和只读的要求,因为通过 setter 方法可以随意添加和修改季节名称。因此,我们需要对类的定义进行修改。创建自定义枚举类的步骤包括:

  1. 将构造器私有化,防止直接 new
  2. 删除 setName() 方法,防止属性被修改;
  3. Season 内部直接创建固定对象,通过 static 修饰符对外暴露对象;
  4. 添加 final 修饰符,优化底层。

注意:枚举对象名通常使用全部大写(常量的命名规范)。

java">
public class Season {private String name;public static final Season SPRING = new Season("春天");public static final Season SUMMER = new Season("夏天");public static final Season AUTUMN = new Season("秋天");public static final Season WINTER = new Season("冬天");private Season(String name) {this.name = name;}}

二、使用 enum 关键字

与自定义类的步骤不同,使用enum关键字实现枚举的步骤包括:

  1. 使用enum替代class
  2. 将构造器私有化;
  3. 直接使用常量名(实参列表),若有多个常量对象,使用,间隔,若使用无参构造器,则实参列表和小括号都可省略;
  4. 枚举对象必须放在枚举类的首行。
java">public enum Season {SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");private String name;private Season(String name) {this.name = name;}
}// 使用时
System.out.println(Season.SPRING);

注意:枚举类的构造器总是私有,可以省略 private 修饰符。如果声明一个 enum 构造器为 publicprotected,则会出现语法错误。另外,枚举类和普通类一样,可以实现接口,形式为 enum 类名 implements 接口1,接口2{}

三、enum 常用方法

java">// 源码定义
public abstract class Enum<E extends Enum<E>>implements Constable, Comparable<E>, Serializable {}

从源码定义来看,当使用 enum 关键字定义一个枚举类时,该枚举类会隐式继承自抽象类 Enum。而 Enum 抽象类实现了多个接口,因此,enum 类可以使用 Enum 类提供的相关方法。常见的方法如下表所示。

方法名描述实例
static Enum valueOf(Class enumClass, String name)返回给定类中有指定名字的枚举常量Season season = Enum.valueOf(Season.class, "SPRING");
String toString()返回枚举常量名Season.SPRING.toString()
int ordinal()返回枚举常量在 enum 声明中的位置,从 0 开始计数Season.SPRING.ordinal()
E[] values()返回定义的所有枚举常量Season[] seasons = Season.values()
int compareTo(E other)若枚举常量位置出现在 other 之前,则返回负整数;如果 this == other,则返回 0;否则,返回正整数season0.compareTo(season1)
final boolean equals(E other)比较两个枚举常量是否相等(也可以用==season0.equals(season1)

注意:使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制。


http://www.ppmy.cn/ops/132921.html

相关文章

元素定位和标准流理解[从本质到理解]

元素定位和标准流理解 1.1 标准流(Normal)布局 默认情况下&#xff0c;元素都是按照normal flow(标准流、常规流、文档流[document flow])进行排布 默认情况下&#xff0c;从左到右&#xff0c;从上到下按顺序摆放好默认情况下&#xff1a;互相之间不存在层叠现象 <body&g…

股票短线的建议(学习)- 20241111

策略 尾盘进早盘出 尾盘30分钟是全天集中交易的时候&#xff0c;多空双方的激烈交战会直接影响到第二天的走势 建议在这时买&#xff1f; 激烈交战&#xff1f;怎么影响&#xff1f; 下午2点30分之后开始筛选。把所有涨幅在3-5%的股票全部加入自选股&#xff0c;低于3%的说明…

hhdb数据库介绍(9-4)

访问安全 权限体系 计算节点有两类用户&#xff0c;一类是计算节点数据库用户&#xff0c;用于操作数据&#xff0c;执行SELECT&#xff0c;UPDATE&#xff0c;DELETE&#xff0c;INSERT等SQL语句。另一类是关系集群数据库可视化管理平台用户&#xff0c;用于管理配置信息。此…

15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!

第47天的学习&#xff1a;并发进阶——深入了解Go语言的并发模型&#xff01; 目录 Go并发模型简介Goroutines深度讲解Channels的进阶使用Select语句详解并发模型设计模式实战案例分析常见问题与解决方案 1. Go并发模型简介 Go语言以其内置的并发支持而闻名。通过轻量级的g…

简单介绍下 Java 中的 @Validated 和 @Valid 注解的区别?

文章目录 Valid&#xff1a;专注单个对象的深度验证适用场景使用示例小结 Validated&#xff1a;聚焦接口分组的批量验证适用场景使用示例小结 主要区别总结如何选择&#xff1f;总结推荐阅读文章 在 Java 开发中&#xff0c;为了确保输入数据符合我们的要求&#xff0c;少不了…

新手 Vue 项目运行

前言&#xff1a;前面讲了我们已经将spingboot项目运行起来了&#xff0c;现在我们只需将后台管理的Vue项目运行起来即可完成整个项目。 在运行vue项目之前&#xff0c;请先运行springboot项目&#xff0c;运行步骤请看&#xff1a;运行Springboot Vue 项目_springbootvue项目…

Rollup failed to resolve import “destr“ from ***/node_modules/pinia-plugin-pers

在使用uni-appvuu3piniapinia-plugin-persistedstate开发中&#xff0c; 使用pinia-plugin-persistedstate 一直在报错&#xff0c;其实代码也是比较简单的&#xff0c; import { createPinia } from pinia // 创建 pinia 实例 const pinia createPinia(); import piniaPlugi…

将vscode的终端改为cygwin terminal

现在终端是默认的power shell&#xff0c;没有显示cygwin 接下来选择默认配置文件 找到cygwin的选项即可 然后提示可能不安全什么的&#xff0c;点是&#xff0c;就有了