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.枚举类的更多相关文章

  1. 【Java基础】关于枚举类你可能不知道的事

    目录 谈谈枚举 1. 枚举类的定义 2. 枚举类的底层实现 3. 枚举类的序列化实现 4. 用枚举实现单列 5. 枚举实例的创建过程是线程安全的 谈谈枚举 如果一个类的对象个数是有限的而且是不变的,我 ...

  2. java面向对象程序设计(下)-枚举类

    在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象,这些实例有限而且固定的类,在Java中被称为枚举类 JDK1.5新增了一个enum关键字,(它与 ...

  3. 0029 Java学习笔记-面向对象-枚举类

    可以创建几个对象? n多个:大部分的类,都可以随意创建对象,只要内存不爆掉 1个:比如单例类 有限的几个:采用单例类的设计思路,可以只允许创建少数的几个特定的对象:还有就是枚举类. 创建少数几个对象, ...

  4. java双重检测或枚举类实现线程安全单例(懒汉模式)

    双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...

  5. Java中的enum枚举类

    首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...

  6. Java疯狂讲义笔记——枚举类

    枚举类 ——Java5[基础知识]1,定义枚举类——关键字 enum (地位与class.interface相同).2,枚举类是一个特殊的类,可以有成员变量.方法,实现一个或多个接口,定义自己的构造器 ...

  7. [Java核心技术]五-继承(枚举类)

    ####Java枚举类型(enum) 枚举类型都是继承了Enum类(是一个抽象类)的一个类,我们可以向enum类中添加方法和变量等.编译再反编译可以看到枚举类型对应的类的内容. 每个枚举常量都对应一个 ...

  8. 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类

    __slots__ @property 多重继承 定制类 枚举类 元类 [使用__slots__] 1.动态语言的一个特点就是允许给实例绑定任意的方法和变量,而静态语言(例如Java)必须事先将属性方 ...

  9. [19/03/20-星期三] 常用类_Enum(枚举)类

    一.概念(JDK 1.5之后才有的类) 所有的枚举(英语:enumeration) 类型隐性地继承自 java.lang.Enum.枚举实质上还是类,而每个被枚举的成员实质就是一个枚举类型的实例,他们 ...

  10. [java核心外篇]__Object类与对象类型的转型

    前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...

随机推荐

  1. Android Studio 中 TextView 控件学习

    以下图片都来自于B站视频,仅留作学习记录,方便复习 视频链接 代码练习 <LinearLayout android:layout_width="match_parent" a ...

  2. [nodejs原型链污染及绕过]校赛第四次纳新赛 bypass WP

    前言 赛后自学了nodejs原型链污染后来尝试做这个题,难度不算太大,但是绕过姿势非常奇怪没见过,写一篇总结记录一下做法 wp 首先打开环境发现是一个登录框,题目有附件我们下载查看附件 最关键的就是c ...

  3. Fastapi中Swagger UI加载缓慢的解决方案

    在国内网络经常遇到Swagger UI加载缓慢的问题,这是由于Swagger UI的CSS和JS代码源在国外导致的,所以我们的解决方法是更改Swagger UI的CSS代码和JS代码源到国内的CND实 ...

  4. Go + WebSocket + Chrome Extension:基于真实浏览器环境的 cf_clearance 自动化获取方案

    前言 随着 Web 安全防护技术的演进,Cloudflare 等 CDN 服务商部署的反爬虫机制愈发复杂.传统的 HTTP 客户端库已无法有效应对基于 JavaScript 执行的挑战验证,而 Sel ...

  5. HyperWorks变形域和控制柄方法

    变形域和控制柄方法 使用变形域和控制柄方法进行网格变形时,网格模型被分割成若干个变形子域,位于变形域上的控制柄常常用来控制变形域形状的变化.当控制柄移动时,变形域的形状随之变化,进而影响变形域内部节点 ...

  6. 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 ...

  7. 微信小店与微信小程序简单集成指南

    微信小店现已全面打通小程序生态,为开发者提供强大的电商能力支持.本文将详细介绍各项集成功能及代码实现方案. 一.商品展示与交易能力 1. 商品卡片嵌入 // 基础商品卡片嵌入 <store-pr ...

  8. 【C#】字符串提取(获取两个字符串中间的字符串)

    [C#]字符串提取(获取两个字符串中间的字符串) https://blog.csdn.net/weixin_43553508/article/details/102673668 C#三行代码实现提取两 ...

  9. Codeforces Round #697 (Div. 3) ABCDE 题解

    久违的cf服务器爆炸场 A. Odd Divisor 思路:任何一个数都可以写成\(n = k2^m,其中k是一个奇数\),若k=1,那么n就一定是一个2的幂. view code #include& ...

  10. Day4 备战CCF-CSP练习

    题目描述 有若干个任务需要在一台机器上运行. 它们之间没有依赖关系,因此可以被按照任意顺序执行. 该机器有两个 CPU 和一个 GPU. 对于每个任务,你可以为它分配不同的硬件资源: 在单个 CPU ...