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类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...
随机推荐
- Android Studio 中 TextView 控件学习
以下图片都来自于B站视频,仅留作学习记录,方便复习 视频链接 代码练习 <LinearLayout android:layout_width="match_parent" a ...
- [nodejs原型链污染及绕过]校赛第四次纳新赛 bypass WP
前言 赛后自学了nodejs原型链污染后来尝试做这个题,难度不算太大,但是绕过姿势非常奇怪没见过,写一篇总结记录一下做法 wp 首先打开环境发现是一个登录框,题目有附件我们下载查看附件 最关键的就是c ...
- Fastapi中Swagger UI加载缓慢的解决方案
在国内网络经常遇到Swagger UI加载缓慢的问题,这是由于Swagger UI的CSS和JS代码源在国外导致的,所以我们的解决方法是更改Swagger UI的CSS代码和JS代码源到国内的CND实 ...
- Go + WebSocket + Chrome Extension:基于真实浏览器环境的 cf_clearance 自动化获取方案
前言 随着 Web 安全防护技术的演进,Cloudflare 等 CDN 服务商部署的反爬虫机制愈发复杂.传统的 HTTP 客户端库已无法有效应对基于 JavaScript 执行的挑战验证,而 Sel ...
- HyperWorks变形域和控制柄方法
变形域和控制柄方法 使用变形域和控制柄方法进行网格变形时,网格模型被分割成若干个变形子域,位于变形域上的控制柄常常用来控制变形域形状的变化.当控制柄移动时,变形域的形状随之变化,进而影响变形域内部节点 ...
- Java源码分析系列笔记-18.Semaphore
目录 1. 是什么 2. 原理分析 2.1. uml 3. 公平信号量 3.1. 是什么 3.2. 使用 3.3. 原理分析 3.3.1. 构造方法 3.3.1.1. 公平Sync 3.3.2. ac ...
- 微信小店与微信小程序简单集成指南
微信小店现已全面打通小程序生态,为开发者提供强大的电商能力支持.本文将详细介绍各项集成功能及代码实现方案. 一.商品展示与交易能力 1. 商品卡片嵌入 // 基础商品卡片嵌入 <store-pr ...
- 【C#】字符串提取(获取两个字符串中间的字符串)
[C#]字符串提取(获取两个字符串中间的字符串) https://blog.csdn.net/weixin_43553508/article/details/102673668 C#三行代码实现提取两 ...
- Codeforces Round #697 (Div. 3) ABCDE 题解
久违的cf服务器爆炸场 A. Odd Divisor 思路:任何一个数都可以写成\(n = k2^m,其中k是一个奇数\),若k=1,那么n就一定是一个2的幂. view code #include& ...
- Day4 备战CCF-CSP练习
题目描述 有若干个任务需要在一台机器上运行. 它们之间没有依赖关系,因此可以被按照任意顺序执行. 该机器有两个 CPU 和一个 GPU. 对于每个任务,你可以为它分配不同的硬件资源: 在单个 CPU ...