enum 关键字
概述
enum
关键字用于定义枚举类型,表示一组固定的常量。枚举提供了类型安全的常量定义方式。
语法格式
public enum EnumName {
VALUE1, VALUE2, VALUE3
}
// 带构造器和方法的枚举
public enum EnumName {
VALUE1(param1), VALUE2(param2);
private final Type field;
EnumName(Type param) {
this.field = param;
}
}
基本用法
// 简单枚举
public enum Color {
RED, GREEN, BLUE, YELLOW
}
// 星期枚举
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class EnumExample {
public static void main(String[] args) {
// 使用枚举
Color favoriteColor = Color.BLUE;
Day today = Day.FRIDAY;
System.out.println("喜欢的颜色: " + favoriteColor);
System.out.println("今天是: " + today);
// 枚举比较
if (favoriteColor == Color.BLUE) {
System.out.println("喜欢蓝色");
}
// 遍历所有枚举值
System.out.println("所有颜色:");
for (Color color : Color.values()) {
System.out.println("- " + color);
}
// 获取枚举的序号
System.out.println("蓝色的序号: " + Color.BLUE.ordinal());
// 根据名称获取枚举
Color red = Color.valueOf("RED");
System.out.println("通过名称获取: " + red);
}
}
复杂枚举示例
// 带构造器和方法的枚举
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),
JUPITER(1.9e+27, 7.1492e7),
SATURN(5.688e+26, 6.0268e7),
URANUS(8.686e+25, 2.5559e7),
NEPTUNE(1.024e+26, 2.4746e7);
private final double mass; // 质量 (千克)
private final double radius; // 半径 (米)
// 构造器
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// 方法
public double getMass() {
return mass;
}
public double getRadius() {
return radius;
}
// 计算表面重力
public double surfaceGravity() {
return 6.67300E-11 * mass / (radius * radius);
}
// 计算在该星球上的重量
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
}
public class PlanetExample {
public static void main(String[] args) {
double earthWeight = 75.0; // 地球上的重量 (千克)
System.out.println("在地球上重量为 " + earthWeight + " 千克");
System.out.println("在其他星球上的重量:");
for (Planet planet : Planet.values()) {
System.out.printf("%-10s: %.2f 千克%n",
planet, planet.surfaceWeight(earthWeight));
}
}
}
枚举中的抽象方法
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;
}
},
TIMES("*") {
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE("/") {
@Override
public double apply(double x, double y) {
return x / y;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
// 抽象方法
public abstract double apply(double x, double y);
@Override
public String toString() {
return symbol;
}
}
public class OperationExample {
public static void main(String[] args) {
double x = 10.0;
double y = 3.0;
for (Operation op : Operation.values()) {
System.out.printf("%.1f %s %.1f = %.2f%n",
x, op, y, op.apply(x, y));
}
}
}
枚举在switch中的使用
public enum Status {
PENDING("待处理"),
PROCESSING("处理中"),
COMPLETED("已完成"),
FAILED("失败");
private final String description;
Status(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
public class StatusProcessor {
public static void processStatus(Status status) {
switch (status) {
case PENDING:
System.out.println("任务等待处理");
break;
case PROCESSING:
System.out.println("任务正在处理中...");
break;
case COMPLETED:
System.out.println("任务已完成");
break;
case FAILED:
System.out.println("任务处理失败");
break;
default:
System.out.println("未知状态");
}
}
public static void main(String[] args) {
for (Status status : Status.values()) {
System.out.println("状态: " + status.getDescription());
processStatus(status);
System.out.println("---");
}
}
}
枚举集合
import java.util.*;
public class EnumSetExample {
public static void main(String[] args) {
// 使用EnumSet
EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
System.out.println("工作日: " + weekdays);
System.out.println("周末: " + weekend);
// 使用EnumMap
EnumMap<Color, String> colorNames = new EnumMap<>(Color.class);
colorNames.put(Color.RED, "红色");
colorNames.put(Color.GREEN, "绿色");
colorNames.put(Color.BLUE, "蓝色");
System.out.println("颜色名称:");
for (Map.Entry<Color, String> entry : colorNames.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
最佳实践
使用枚举替代常量:
// 不好的做法 public static final int STATUS_PENDING = 1; public static final int STATUS_PROCESSING = 2; public static final int STATUS_COMPLETED = 3; // 好的做法 public enum Status { PENDING, PROCESSING, COMPLETED }
为枚举添加有意义的方法:
public enum Priority { LOW(1), MEDIUM(5), HIGH(10); private final int level; Priority(int level) { this.level = level; } public boolean isHigherThan(Priority other) { return this.level > other.level; } }
使用枚举实现单例模式:
public enum Singleton { INSTANCE; public void doSomething() { System.out.println("执行操作"); } }
enum关键字提供了类型安全、性能优秀的常量定义方式,是Java编程中的重要特性。