78. Java 枚举类 - 在枚举中添加成员(字段、构造方法、
2025-05-14 本文已影响0人
Cache技术分享
78. Java 枚举类 - 在枚举中添加成员(字段、构造方法、方法)
在 Java 中,枚举不仅仅是一些常量的集合,它实际上是 一种特殊的类,可以包含:
✅ 字段(变量)
✅ 构造方法
✅ 实例方法
如果我们想给枚举常量添加额外的信息(比如缩写、数值等),就可以使用这些功能! 🚀
1️⃣ 为什么要给枚举添加字段?
假设我们有一个 DayOfWeek
枚举,默认情况下,它只有:
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
但如果我们 想为每个星期几添加一个缩写(比如 MON
代表 Monday
)怎么办?
我们不能简单地这样写:
DayOfWeek today = DayOfWeek.MONDAY;
System.out.println(today + " -> MON"); // ❌ 不够优雅
正确的做法:在 DayOfWeek
枚举中添加字段和方法! 💡
2️⃣ 给枚举添加字段和方法
public enum DayOfWeek {
// 添加缩写字段(MON, TUE, WED...)
MONDAY("MON"), TUESDAY("TUE"), WEDNESDAY("WED"),
THURSDAY("THU"), FRIDAY("FRI"),
SATURDAY("SAT"), SUNDAY("SUN");
private final String abbreviation; // 定义私有字段
// 构造方法
DayOfWeek(String abbreviation) {
this.abbreviation = abbreviation;
}
// 获取缩写的方法
public String getAbbreviation() {
return abbreviation;
}
}
public class EnumTest {
public static void main(String[] args) {
DayOfWeek today = DayOfWeek.FRIDAY;
System.out.println("Today is " + today + ", abbreviation: " + today.getAbbreviation());
}
}
💡 输出
Today is FRIDAY, abbreviation: FRI
3️⃣ 代码解析
✅ 1. 枚举常量可以有参数
MONDAY("MON"), TUESDAY("TUE"), WEDNESDAY("WED"), ...
-
MONDAY("MON")
这里MON
是传给 构造方法 的参数。
✅ 2. 枚举可以有字段
private final String abbreviation;
-
abbreviation
变量存储每个枚举常量的缩写。 -
使用
final
修饰,保证不可修改。
✅ 3. 枚举可以有构造方法
DayOfWeek(String abbreviation) {
this.abbreviation = abbreviation;
}
-
构造方法 用来初始化
abbreviation
。 -
构造方法必须是
private
,因为不能手动创建枚举实例(只能用MONDAY, TUESDAY, ...
这些定义好的实例)。
✅ 4. 枚举可以有方法
public String getAbbreviation() {
return abbreviation;
}
- 这个方法用来获取枚举的缩写。
4️⃣ 枚举可以有多个字段
除了缩写,我们还能给每一天添加“是否是工作日”这个字段:
public enum DayOfWeek {
MONDAY("MON", true), TUESDAY("TUE", true), WEDNESDAY("WED", true),
THURSDAY("THU", true), FRIDAY("FRI", true),
SATURDAY("SAT", false), SUNDAY("SUN", false);
private final String abbreviation;
private final boolean isWeekday;
DayOfWeek(String abbreviation, boolean isWeekday) {
this.abbreviation = abbreviation;
this.isWeekday = isWeekday;
}
public String getAbbreviation() {
return abbreviation;
}
public boolean isWeekday() {
return isWeekday;
}
}
public class EnumTest {
public static void main(String[] args) {
DayOfWeek today = DayOfWeek.FRIDAY;
System.out.println(today + " (" + today.getAbbreviation() + "), is it a weekday? " + today.isWeekday());
}
}
💡 输出
FRIDAY (FRI), is it a weekday? true
📌 代码解析
-
新增
isWeekday
字段,用于判断这一天是不是工作日。 -
在构造方法中传入
true/false
来初始化isWeekday
。 -
新增
isWeekday()
方法,用于返回true/false
。
5️⃣ 枚举可以有抽象方法
我们甚至可以给枚举定义不同的行为,比如:
public enum Operation {
ADD {
public double apply(double x, double y) {
return x + y;
}
},
SUBTRACT {
public double apply(double x, double y) {
return x - y;
}
},
MULTIPLY {
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE {
public double apply(double x, double y) {
return x / y;
}
};
public abstract double apply(double x, double y);
}
public class EnumTest {
public static void main(String[] args) {
double result = Operation.MULTIPLY.apply(10, 5);
System.out.println("Multiplication result: " + result);
}
}
💡 输出
Multiplication result: 50.0
📌 代码解析
-
Operation
是一个枚举,它定义了四种数学运算。 -
每个枚举常量都实现了
apply()
方法,定义了它自己的行为。 -
抽象方法
apply()
让每个枚举常量都必须提供自己的实现。
6️⃣ 什么时候使用枚举字段?
✅ 适合使用的情况
- 需要给枚举常量存储额外信息(比如缩写、数值、颜色)。
- 需要让枚举常量拥有不同的行为(比如
apply()
方法)。 - 需要让代码更加直观和安全(避免使用
if-else
或switch
语句)。
❌ 不适合使用的情况
- 值的范围是动态的(比如:从数据库加载的用户角色)。
-
只需要简单的常量,不需要额外字段(可以直接
MONDAY, TUESDAY, ...
)。
🔹 总结
特性 | 说明 |
---|---|
枚举可以有字段 | ✅ 可以存储额外信息(如缩写、数值等) |
枚举可以有构造方法 | ✅ 只能是 private ,用于初始化字段 |
枚举可以有方法 | ✅ 可以添加 getAbbreviation() 之类的方法 |
枚举可以有多个字段 | ✅ 可以存储多个信息(如 abbreviation 和 isWeekday ) |
枚举可以有抽象方法 | ✅ 适用于不同的行为(如 apply() 方法) |
希望这个讲解能帮你更好地理解 如何给枚举添加字段、构造方法和方法!🚀 🎯