Java中学习Enum
一、前言
enum
在 Java 中不仅可以用于定义常量,还可以包含方法、字段和构造函数,使其功能更加丰富和灵活。下面是一些进阶使用的示例:
1. 定义字段和方法
你可以在 enum
中定义字段、方法和构造函数。这样可以将更多的行为和数据关联到每个常量上。
public enum Day {
MONDAY("Monday", false),
TUESDAY("Tuesday", false),
WEDNESDAY("Wednesday", false),
THURSDAY("Thursday", false),
FRIDAY("Friday", false),
SATURDAY("Saturday", true),
SUNDAY("Sunday", true);
private final String name;
private final boolean isWeekend;
Day(String name, boolean isWeekend) {
this.name = name;
this.isWeekend = isWeekend;
}
public String getName() {
return name;
}
public boolean isWeekend() {
return isWeekend;
}
@Override
public String toString() {
return name;
}
}
在上面的代码中,Day
枚举包含了两个字段:name
和 isWeekend
,以及它们的 getter 方法和一个 toString
方法来返回自定义的字符串表示。
2. 实现接口
enum
可以实现接口,使其可以具有额外的功能或行为。
interface Describable {
String getDescription();
}
public enum Day implements Describable {
MONDAY("First day of the work week"),
TUESDAY("Second day of the work week"),
WEDNESDAY("Middle of the work week"),
THURSDAY("Second to last day of the work week"),
FRIDAY("Last day of the work week"),
SATURDAY("Start of the weekend"),
SUNDAY("End of the weekend");
private final String description;
Day(String description) {
this.description = description;
}
@Override
public String getDescription() {
return description;
}
}
在这个例子中,Day
枚举实现了 Describable
接口,并提供了 getDescription
方法。
3. 使用静态方法
enum
可以定义静态方法,这些方法可以用于获取 enum
的实例或执行其他操作。
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
public static Day fromString(String dayName) {
for (Day day : Day.values()) {
if (day.name().equalsIgnoreCase(dayName)) {
return day;
}
}
throw new IllegalArgumentException("No enum constant for " + dayName);
}
}
在这个示例中,fromString
方法将字符串转换为 Day
枚举的实例。
4. 重写 toString
方法
你可以重写 toString
方法,以提供更适合的字符串表示。
public enum Day {
MONDAY("Mon"),
TUESDAY("Tue"),
WEDNESDAY("Wed"),
THURSDAY("Thu"),
FRIDAY("Fri"),
SATURDAY("Sat"),
SUNDAY("Sun");
private final String abbreviation;
Day(String abbreviation) {
this.abbreviation = abbreviation;
}
@Override
public String toString() {
return abbreviation;
}
}
在这个例子中,toString
方法返回了缩写形式的星期几。
5. 使用构造函数
enum
枚举常量可以使用构造函数来初始化字段。注意构造函数默认是 private
的。
public enum Status {
NEW("New Order"),
PROCESSING("Order is being processed"),
SHIPPED("Order has been shipped"),
DELIVERED("Order has been delivered");
private final String description;
Status(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
这些进阶用法使 enum
在 Java 编程中变得非常强大和灵活。通过字段、方法和构造函数的组合,你可以将更多的逻辑和数据封装在 enum
常量中,使代码更加清晰和易于维护。
二、使用案例
下面是使用上述 enum
的一些调用案例:
1. 使用 Day
枚举
public class Main {
public static void main(String[] args) {
// 访问枚举常量
Day today = Day.SATURDAY;
// 使用方法
System.out.println("Today is " + today.getName()); // 输出: Today is Saturday
System.out.println("Is it a weekend? " + today.isWeekend()); // 输出: Is it a weekend? true
// 使用静态方法
Day dayFromString = Day.fromString("Monday");
System.out.println("Day from string: " + dayFromString); // 输出: Day from string: MONDAY
}
}
2. 使用 Describable
接口
public class Main {
public static void main(String[] args) {
// 访问枚举常量
Day today = Day.FRIDAY;
// 使用接口方法
System.out.println(today.getDescription()); // 输出: Last day of the work week
}
}
3. 使用 Status
枚举
public class Main {
public static void main(String[] args) {
// 访问枚举常量
Status orderStatus = Status.SHIPPED;
// 使用方法
System.out.println("Order status: " + orderStatus.getDescription()); // 输出: Order status: Order has been shipped
}
}
4. 使用 toString
方法
public class Main {
public static void main(String[] args) {
// 访问枚举常量
Day today = Day.WEDNESDAY;
// 使用重写的 toString 方法
System.out.println("Abbreviation for today: " + today); // 输出: Abbreviation for today: Wed
}
}
这些例子展示了如何在实际应用中调用和使用 enum
,充分利用其提供的各种功能和方法。