78. Java 枚举类 - 在枚举中添加成员(字段、构造方法、方法)

119 阅读3分钟

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-elseswitch 语句)。

不适合使用的情况

  • 值的范围是动态的(比如:从数据库加载的用户角色)。
  • 只需要简单的常量,不需要额外字段(可以直接 MONDAY, TUESDAY, ...)。

🔹 总结

特性说明
枚举可以有字段✅ 可以存储额外信息(如缩写、数值等)
枚举可以有构造方法✅ 只能是 private,用于初始化字段
枚举可以有方法✅ 可以添加 getAbbreviation() 之类的方法
枚举可以有多个字段✅ 可以存储多个信息(如 abbreviationisWeekday
枚举可以有抽象方法✅ 适用于不同的行为(如 apply() 方法)

希望这个讲解能帮你更好地理解 如何给枚举添加字段、构造方法和方法!🚀 🎯