Java 枚举详解:看完立马掌握!

ops/2024/10/10 17:38:49/

大家好,我是小欧!
今天我们来聊聊Java中的枚举(Enum)。枚举是Java中一种特殊的类型,用来表示一组固定的常量。如果你还没接触过枚举或者对它了解不多,别担心,看完这篇文章,你一定会对枚举有个清晰的认识。

什么是枚举?

枚举(Enum)是用来定义一组常量的特殊类。在Java中,枚举类型是一个特殊的类,它表示一个固定的集合,这些集合中的元素被称为枚举常量。比如,我们可以用枚举来表示一周的七天、四季、方向等等。

举个例子,我们用枚举来表示一周的七天:

java">public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

为什么要使用枚举?

在介绍如何使用枚举之前,我们先来看看为什么要使用枚举。枚举有以下几个好处:

  1. 类型安全:使用枚举可以避免常量值不匹配的问题。例如,在使用枚举之前,我们可能会使用整数或字符串来表示一组常量,这样容易导致传递错误的值。枚举提供了编译时检查,确保传递的值是有效的。

  2. 代码可读性强:枚举使代码更具可读性和可维护性。你不再需要记住每个常量对应的整数值或字符串值,只需要使用枚举常量即可。

  3. 功能强大:枚举不仅仅是常量集合,还可以包含方法和字段,从而增加更多的功能。

枚举的基本用法

定义枚举

定义枚举非常简单,使用enum关键字即可。下面我们定义一个表示季节的枚举:

java">public enum Season {SPRING, SUMMER, AUTUMN, WINTER
}

使用枚举

使用枚举也很简单,我们可以直接引用枚举常量:

java">public class EnumTest {public static void main(String[] args) {Season season = Season.SUMMER;System.out.println("The current season is: " + season);}
}

运行结果:

The current season is: SUMMER

枚举中的方法

枚举可以包含方法。例如,我们给Season枚举添加一个方法,返回季节的描述:

java">public enum Season {SPRING("Spring season is pleasant."),SUMMER("Summer season is hot."),AUTUMN("Autumn season is cool."),WINTER("Winter season is cold.");private String description;Season(String description) {this.description = description;}public String getDescription() {return description;}
}

我们可以这样使用这个方法:

java">public class EnumTest {public static void main(String[] args) {for (Season season : Season.values()) {System.out.println(season + ": " + season.getDescription());}}
}

运行结果:

SPRING: Spring season is pleasant.
SUMMER: Summer season is hot.
AUTUMN: Autumn season is cool.
WINTER: Winter season is cold.

枚举中的抽象方法

枚举还可以包含抽象方法,每个枚举常量都必须实现这个方法。下面我们定义一个表示操作符的枚举,并为每个操作符定义一个计算方法:

java">public enum Operation {PLUS {@Overridepublic int apply(int x, int y) {return x + y;}},MINUS {@Overridepublic int apply(int x, int y) {return x - y;}},TIMES {@Overridepublic int apply(int x, int y) {return x * y;}},DIVIDE {@Overridepublic int apply(int x, int y) {return x / y;}};public abstract int apply(int x, int y);
}

我们可以这样使用这个枚举:

java">public class EnumTest {public static void main(String[] args) {int x = 10;int y = 5;for (Operation op : Operation.values()) {System.out.println(x + " " + op + " " + y + " = " + op.apply(x, y));}}
}

运行结果:

10 PLUS 5 = 15
10 MINUS 5 = 5
10 TIMES 5 = 50
10 DIVIDE 5 = 2

枚举的高级用法

使用接口组织枚举

如果一个枚举需要实现多个接口,可以使用接口来组织枚举常量。例如,假设我们有两个接口MoveableDrawable

java">interface Moveable {void move();
}interface Drawable {void draw();
}

我们可以定义一个枚举实现这两个接口:

java">public enum Robot implements Moveable, Drawable {WALKING {@Overridepublic void move() {System.out.println("Robot is walking.");}@Overridepublic void draw() {System.out.println("Drawing walking robot.");}},FLYING {@Overridepublic void move() {System.out.println("Robot is flying.");}@Overridepublic void draw() {System.out.println("Drawing flying robot.");}};
}

使用这个枚举:

java">public class EnumTest {public static void main(String[] args) {for (Robot robot : Robot.values()) {robot.move();robot.draw();}}
}

运行结果:

Robot is walking.
Drawing walking robot.
Robot is flying.
Drawing flying robot.

枚举的比较

我们可以使用==equals()方法来比较枚举常量。事实上,==已经足够,因为每个枚举常量都是唯一的:

java">public class EnumTest {public static void main(String[] args) {Day day1 = Day.MONDAY;Day day2 = Day.MONDAY;Day day3 = Day.TUESDAY;System.out.println(day1 == day2); // trueSystem.out.println(day1.equals(day2)); // trueSystem.out.println(day1 == day3); // false}
}

运行结果:

true
true
false

枚举与Switch语句

枚举常常与switch语句一起使用,使代码更简洁:

java">public class EnumTest {public static void main(String[] args) {Day day = Day.FRIDAY;switch (day) {case MONDAY:System.out.println("Start of the work week.");break;case FRIDAY:System.out.println("End of the work week.");break;case SATURDAY:case SUNDAY:System.out.println("Weekend!");break;default:System.out.println("Midweek days.");break;}}
}

运行结果:

End of the work week.

枚举的序列化

枚举是天然可序列化的,这意味着你可以直接将枚举常量进行序列化和反序列化,而不会有额外的代码需求:

java">import java.io.*;public class EnumTest {public static void main(String[] args) {try {// 序列化ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("day.ser"));out.writeObject(Day.MONDAY);out.close();// 反序列化ObjectInputStream in = new ObjectInputStream(new FileInputStream("day.ser"));Day day = (Day) in.readObject();in.close();System.out.println("Deserialized day: " + day);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

运行结果:

Deserialized day: MONDAY

总结

通过这篇文章,我们了解了Java中枚举的基本用法和高级用法。枚举不仅可以用来定义常量集合,还可以包含方法,甚至实现接口,使其功能非常强大。如果你还没用过枚举,赶紧试试吧!枚举不仅让代码更简洁、更安全,还能提高你的代码质量。希望这篇文章能帮助你更好地理解和使用Java枚举。关注我一起Happy coding!


http://www.ppmy.cn/ops/86964.html

相关文章

理解轮询与WebSocket:更新HTML内容的两种方式

理解轮询与WebSocket:更新HTML内容的两种方式 在开发Web应用时,更新页面内容的方式有很多,其中轮询(Polling)和WebSocket是两种常见的方法。了解这两种方法的区别、工作原理及其优缺点,有助于你选择最适合…

解决新Windows系统下Git克隆连接超时问题

最近,我在Windows系统的电脑上,尝试使用Git克隆项目时,不断遇到连接超时的错误。无论如何尝试调整环境变量或配置代理,都未能解决问题。因此,开始了一系列的问题排查。 排查步骤 首先,我在Git Bash终端使…

C语言系统调用linux文件系统

在C语言中,open、write和read函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件…

reduceByKey 函数详解

reduceByKey 函数详解 实现原理 reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数: keySelector:这是一个映射函数,用于从输入元素中提取键。 valueReducer:这是另一个函数,用于将具有相同键的…

mac环境Qt Creator报错:Warning: You are changing a read-only file.

mac环境Qt Creator报错: Warning: You are changing a read-only file. 权限许可 文件权限问题 修改文件夹权限的基本语法: 打开终端:打开 macOS 中的终端应用程序。 sudo chmod -R permissions folder_pathchmod 是改变文件或文件夹权限…

鸿蒙(HarmonyOS)自定义Dialog实现时间选择控件

一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0(API 9) 二、效果图 三、代码 SelectedDateDialog.ets文件/*** 时间选择*/ CustomDialog export struct SelectedDateDialog {State selectedDate:…

QT--线程

一、线程QThread QThread 类提供不依赖平台的管理线程的方法,如果要设计多线程程序,一般是从 QThread继承定义一个线程类,在自定义线程类里进行任务处理。qt拥有一个GUI线程,该线程阻塞式监控窗体,来自任何用户的操作都会被gui捕获到,并处理…

Nginx的跨域问题解决

Nginx的跨域问题解决 假设有两台服务器:分别是192.168.101.23(nginx1), 192.168.101.18(nginx2) 在nginx2上有一个get_user资源。 #nginx2 powershelllocation /get_user {default_type application/json;return 200 …