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类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...
随机推荐
- REVM移植小记
之前做过的一些部署移植的工作,基本都是用C++语言写的,在后来我学了一些Rust,并且慢慢熟悉了Rust的工具链,最近也在尝试部署一些Rust的开源项目到OpenEuler RISC-V操作系统上 ...
- list.stream笔记-过滤-去重-转map、List等
代码 import vo.PosDataDetailVo; import java.util.*; import java.util.stream.Collectors; public class A ...
- 垃圾qt,毁我青春
一.前言说明 在软件开发的漫漫征途中,我与 Qt 的邂逅本以为是一场美妙的合作,然而,现实却给了我沉重的一击."垃圾 qt,毁我青春",这句看似过激的话语,实则饱含了我在 Qt 开 ...
- Svelte 5状态管理实战:基于Tauri框架的AI阅读器Saga Reader开发实践
一.项目背景:当AI阅读遇到跨平台需求 Saga Reader(麒睿智库)是一款基于AI技术的轻量级跨平台阅读器,核心功能涵盖RSS订阅.内容智能抓取.AI内容处理(如翻译.摘要)及本地存储.项目采用 ...
- 基于谷歌内核(Chromium)浏览器Cookie值的读取工具
一.基于谷歌内核浏览器的cookie文件保存位置 以目前流行的三款基于Chrominum内核的浏览器为例,Cookie文件保存在当前用户的AppData目录下,注意该文件没有扩展名. 1.谷歌的Chr ...
- 温州大学X袋鼠云:高等人才教育建设,如何做到“心中有数”
2022 年 4 月 16 日,神十三在东风着陆场预定区域成功着陆.接下来从 5 月开始,我国还将进行 6 次飞行任务,在今年内完成中国空间站的在轨建造.而以目前情况推测,在国际空间站退役后,中国空间 ...
- shelve 的使用
import shelve import time from typing import Any def cache_data(key: str, data: Any, shelf_file: str ...
- .NET Core如何通过认证机制访问Kafka?
大家好,我是Edison. 最近有一个ASP.NET Core使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番, ...
- 工作流引擎系统-基于橙单(flowable)的系统开发-流程配置举例
什么是工作流引擎(Workflow Engine ) 例如开发一个系统,最关键的部分不是系统的界面(增删改查之类),也不是和数据库之间的交互(读写数据库之类),而是如何根据业务逻辑开发出符合实际需要的 ...
- 可以安装成功的red5资源
找了好久,只有这个可用 https://download.csdn.net/download/haiwalt/8600781 注意下 RED5_HOME 路径是运行exe文件后 有个 D:\Re ...