Java 枚举(enum)
枚举是 Java 5 引入的特殊类,用于定义一组固定的常量。理解枚举的使用是编写类型安全代码的关键。本章将详细介绍 Java 中的枚举。
枚举的概念
什么是枚举
**枚举(Enum)**是一种特殊的类,用于定义一组固定的常量值。
// 定义枚举
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
// 使用枚举
Season currentSeason = Season.SPRING;
System.out.println(currentSeason); // SPRING
为什么使用枚举
枚举的优势:
- 类型安全:编译时检查,避免无效值
- 代码清晰:比魔法数字和字符串更清晰
- 功能强大:可以有方法、属性、构造方法
- 单例模式:每个枚举值都是单例
基本枚举
简单枚举
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
// 使用
Day today = Day.MONDAY;
if (today == Day.MONDAY) {
System.out.println("今天是星期一");
}
枚举的常用方法
public enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
// 获取所有枚举值
Day[] days = Day.values();
for (Day day : days) {
System.out.println(day);
}
// 根据名称获取枚举值
Day day = Day.valueOf("MONDAY");
// 获取枚举值的名称
String name = Day.MONDAY.name(); // "MONDAY"
// 获取枚举值的序号
int ordinal = Day.MONDAY.ordinal(); // 0
高级枚举
枚举可以有属性
public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6),
MARS(6.421e+23, 3.3972e6);
private final double mass; // 质量
private final double radius; // 半径
// 构造方法
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// Getter 方法
public double getMass() {
return mass;
}
public double getRadius() {
return radius;
}
// 计算方法
public double getSurfaceGravity() {
double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}
// 使用
Planet earth = Planet.EARTH;
System.out.println("地球质量:" + earth.getMass());
System.out.println("地球表面重力:" + earth.getSurfaceGravity());
枚举可以有方法
public enum Operation {
PLUS {
@Override
public double apply(double x, double y) {
return x + y;
}
},
MINUS {
@Override
public double apply(double x, double y) {
return x - y;
}
},
MULTIPLY {
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE {
@Override
public double apply(double x, double y) {
return x / y;
}
};
// 抽象方法:每个枚举值必须实现
public abstract double apply(double x, double y);
}
// 使用
double result = Operation.PLUS.apply(10, 5); // 15
枚举可以实现接口
public interface Describable {
String getDescription();
}
public enum Status implements Describable {
ACTIVE("激活状态"),
INACTIVE("未激活状态"),
PENDING("待处理状态");
private final String description;
Status(String description) {
this.description = description;
}
@Override
public String getDescription() {
return description;
}
}
// 使用
Status status = Status.ACTIVE;
System.out.println(status.getDescription()); // "激活状态"