Java核心类——6.枚举类
Java枚举类(Enum)
枚举类(Enum)是 Java 中用于表示固定常量集合的特殊类,相比传统static final常量定义,它提供了更强的类型安全和可读性。
枚举类的本质和特性
通过enum定义的枚举类,本质上是继承了java.lang.Enum的特殊类,例如,我们定义的Color枚举类:
public enum Color {
RED, GREEN, BLUE;
}
编译器会为其生成类似以下的代码:
public final class Color extends Enum { // 继承自Enum,标记为final class
// 每个实例均为全局唯一:
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public static final Color BLUE = new Color();
// private构造方法,确保外部无法调用new操作符:
private Color() {}
}
枚举类具有以下特性:
- 被
final修饰,无法被继承 - 构造方法为
private,确保无法从外部创建实例 - 每个枚举常量都是该类的唯一实例
- 父类
java.lang.Enum实现了Comparable接口,其排序逻辑直接基于枚举常量的定义顺序(即ordinal()方法返回的顺序号,从 0 开始)
枚举类的基本使用
使用enum定义枚举类非常简洁:
// 定义星期枚举
enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT
}
使用枚举类时,通过类名直接访问枚举常量:
public class Main {
public static void main(String[] args) {
Weekday today = Weekday.SUN;
if (today == Weekday.SAT || today == Weekday.SUN) {
System.out.println("今天是周末,在家休息");
} else {
System.out.println("今天是工作日,去上班");
}
}
}
枚举类的常用方法
Enum类提供了几个常用方法:
| 方法 | 描述 |
|---|---|
name() |
返回枚举常量的名称(定义时的字符串) |
ordinal() |
返回枚举常量的顺序号(从0开始) |
valueOf(Class<T> enumType, String name) |
根据名称获取枚举常量 |
示例:
Weekday day = Weekday.MON;
System.out.println(day.name()); // 输出 "MON"
System.out.println(day.ordinal()); // 输出 1(因为MON是第二个定义的常量)
// 通过名称获取枚举常量
Weekday tuesday = Weekday.valueOf("TUE");
System.out.println(tuesday);//TUE
System.out.println(tuesday.ordinal());//2
注意:
ordinal()方法返回的顺序号依赖于枚举常量的定义顺序,修改顺序会导致返回值变化。
带字段和方法的枚举类
枚举类可以像普通类一样定义字段、构造方法和自定义方法,使枚举常量携带更多信息。
例如,为星期枚举添加数值和中文名称:
enum Weekday {
// 枚举常量必须在最前面定义,后面跟构造参数
MON(1, "星期一"),
TUE(2, "星期二"),
WED(3, "星期三"),
THU(4, "星期四"),
FRI(5, "星期五"),
SAT(6, "星期六"),
SUN(0, "星期日");
// 定义字段
public final int dayValue;
private final String chineseName;
// 私有构造方法
private Weekday(int dayValue, String chineseName) {
this.dayValue = dayValue;
this.chineseName = chineseName;
}
// 自定义方法
public String getChineseName() {
return chineseName;
}
// 覆写toString方法
@Override
public String toString() {
return chineseName;
}
}
使用示例:
public class Main {
public static void main(String[] args) {
Weekday today = Weekday.SUN;
System.out.println("今天是" + today); // 输出 "今天是星期日"
System.out.println("对应数值:" + today.dayValue); // 输出 "对应数值:0"
}
}
最佳实践:枚举类的字段应声明为
final,确保不可变;构造方法必须是private的。
枚举类在switch语句中的应用
枚举类非常适合用于switch语句,编译器会检查所有可能的枚举常量(指编译器会验证switch分支是否覆盖了该枚举类中定义的所有常量),避免遗漏:
public class Main {
public static void main(String[] args) {
Weekday today = Weekday.FRI;
switch (today) {
case MON:
case TUE:
case WED:
case THU:
case FRI:
System.out.println(today.getChineseName() + ",努力工作!");
break;
case SAT:
case SUN:
System.out.println(today.getChineseName() + ",好好休息!");
break;
default:
// 对于枚举类型,default通常不会执行,但保留可避免未来添加新常量时出错
throw new IllegalArgumentException("未知的星期:" + today);
}
}
}
总结
- 理解枚举类的本质(被编译为final class Xxx extends Enum { … })和特性(不可继承、实例唯一)
- 掌握枚举类的常用方法
- 掌握为enum编写构造方法、字段和方法
- 了解枚举类适用于表示状态、类型、选项等固定集合的场景,如星期、月份、颜色、订单状态等。
Java核心类——6.枚举类的更多相关文章
- 【Java基础】关于枚举类你可能不知道的事
目录 谈谈枚举 1. 枚举类的定义 2. 枚举类的底层实现 3. 枚举类的序列化实现 4. 用枚举实现单列 5. 枚举实例的创建过程是线程安全的 谈谈枚举 如果一个类的对象个数是有限的而且是不变的,我 ...
- java面向对象程序设计(下)-枚举类
在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象,这些实例有限而且固定的类,在Java中被称为枚举类 JDK1.5新增了一个enum关键字,(它与 ...
- 0029 Java学习笔记-面向对象-枚举类
可以创建几个对象? n多个:大部分的类,都可以随意创建对象,只要内存不爆掉 1个:比如单例类 有限的几个:采用单例类的设计思路,可以只允许创建少数的几个特定的对象:还有就是枚举类. 创建少数几个对象, ...
- java双重检测或枚举类实现线程安全单例(懒汉模式)
双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...
- Java中的enum枚举类
首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...
- Java疯狂讲义笔记——枚举类
枚举类 ——Java5[基础知识]1,定义枚举类——关键字 enum (地位与class.interface相同).2,枚举类是一个特殊的类,可以有成员变量.方法,实现一个或多个接口,定义自己的构造器 ...
- [Java核心技术]五-继承(枚举类)
####Java枚举类型(enum) 枚举类型都是继承了Enum类(是一个抽象类)的一个类,我们可以向enum类中添加方法和变量等.编译再反编译可以看到枚举类型对应的类的内容. 每个枚举常量都对应一个 ...
- 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类
__slots__ @property 多重继承 定制类 枚举类 元类 [使用__slots__] 1.动态语言的一个特点就是允许给实例绑定任意的方法和变量,而静态语言(例如Java)必须事先将属性方 ...
- [19/03/20-星期三] 常用类_Enum(枚举)类
一.概念(JDK 1.5之后才有的类) 所有的枚举(英语:enumeration) 类型隐性地继承自 java.lang.Enum.枚举实质上还是类,而每个被枚举的成员实质就是一个枚举类型的实例,他们 ...
- [java核心外篇]__Object类与对象类型的转型
前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...
随机推荐
- DevOps 需要处理的工作
本文纯属个人工作记录: 1.部署Linux服务器 2.安装Docker 3.在Docker中安装Gitlab和runner 4.设置Gitlab pipline,即CI/CD 5.可能需要Jenkin ...
- Kubernetes初学乍练(资源管理)
1.资源管理介绍 在Kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理Kubernetes.怎么理解,就好比我们常说的面向对象语言,一切皆对象. Kubernetes的本质就是 ...
- kubernetes之statefulset控制器介绍
一.简单说明 StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在Statefu ...
- SAP的PI日志查看工具
被很多人吐槽的SAP PI能坚挺的活下来,真是不容易... SXI_MONITOR是PI的标准的消息查看器,如果又权限的话,甚至可以做自定义字段的查询增强(如果对单据创建接口,增加单号...速度杠杠的 ...
- 数栈技术分享:开源·数栈-扩展FlinkSQL实现流与维表的join
一.扩展FlinkSQL实现流与维表的join 二.为什么要扩展FlinkSQL? 1.实时计算需要完全SQL化 SQL是数据处理中使用最广泛的语言.它允许用户简明扼要地声明他们的业务逻辑.大数据 ...
- 1-python中的两大法宝和加载数据
python中的两大法宝和加载数据 1. Python两大法宝 ① Python3.6.3相当于一个package,package里面有不同的区域,不同的区域有不同的工具. ② Python语法有两大 ...
- Centos7在原有磁盘上磁盘扩容
如下示例使用VMWare虚拟化软件给虚拟centos7系统进行相关磁盘扩容 1.查看目前磁盘容量 2.VMWare给虚拟系统扩展空间 注意在虚拟系统关机情况下进行 3.查看扩容后磁盘情况 4.创建磁盘 ...
- .NET周刊【6月第5期 2025-06-29】
国内文章 为什么说方法的参数最好不要超过4个? https://www.cnblogs.com/lmy5215006/p/18919081 本文探讨了调用协定的概念,包括参数传递方式.栈清理和寄存器使 ...
- CentOS7安装SMPlayer和VLC Player
原文地址 我装完之后,看大概是1个多G的MP4视频依然是觉得有点卡.不知道为什么,流畅度照比Windows下的视频播放器差多了. You will need to also install the E ...
- windows cmake 需要qt 如何做
简介 RT Qt windows识别 -find Qt components set (CMAKE_PREFIX_PATH "E://winsoft//qt//5.12.10//msvc20 ...