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. REVM移植小记

      之前做过的一些部署移植的工作,基本都是用C++语言写的,在后来我学了一些Rust,并且慢慢熟悉了Rust的工具链,最近也在尝试部署一些Rust的开源项目到OpenEuler RISC-V操作系统上 ...

  2. list.stream笔记-过滤-去重-转map、List等

    代码 import vo.PosDataDetailVo; import java.util.*; import java.util.stream.Collectors; public class A ...

  3. 垃圾qt,毁我青春

    一.前言说明 在软件开发的漫漫征途中,我与 Qt 的邂逅本以为是一场美妙的合作,然而,现实却给了我沉重的一击."垃圾 qt,毁我青春",这句看似过激的话语,实则饱含了我在 Qt 开 ...

  4. Svelte 5状态管理实战:基于Tauri框架的AI阅读器Saga Reader开发实践

    一.项目背景:当AI阅读遇到跨平台需求 Saga Reader(麒睿智库)是一款基于AI技术的轻量级跨平台阅读器,核心功能涵盖RSS订阅.内容智能抓取.AI内容处理(如翻译.摘要)及本地存储.项目采用 ...

  5. 基于谷歌内核(Chromium)浏览器Cookie值的读取工具

    一.基于谷歌内核浏览器的cookie文件保存位置 以目前流行的三款基于Chrominum内核的浏览器为例,Cookie文件保存在当前用户的AppData目录下,注意该文件没有扩展名. 1.谷歌的Chr ...

  6. 温州大学X袋鼠云:高等人才教育建设,如何做到“心中有数”

    2022 年 4 月 16 日,神十三在东风着陆场预定区域成功着陆.接下来从 5 月开始,我国还将进行 6 次飞行任务,在今年内完成中国空间站的在轨建造.而以目前情况推测,在国际空间站退役后,中国空间 ...

  7. shelve 的使用

    import shelve import time from typing import Any def cache_data(key: str, data: Any, shelf_file: str ...

  8. .NET Core如何通过认证机制访问Kafka?

    大家好,我是Edison. 最近有一个ASP.NET Core使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番, ...

  9. 工作流引擎系统-基于橙单(flowable)的系统开发-流程配置举例

    什么是工作流引擎(Workflow Engine ) 例如开发一个系统,最关键的部分不是系统的界面(增删改查之类),也不是和数据库之间的交互(读写数据库之类),而是如何根据业务逻辑开发出符合实际需要的 ...

  10. 可以安装成功的red5资源

    找了好久,只有这个可用 https://download.csdn.net/download/haiwalt/8600781 注意下 RED5_HOME 路径是运行exe文件后   有个  D:\Re ...