概念
Enum(枚举)是 Java 中一种特殊的类,用于定义一组固定的常量。它提供了一种类型安全的方式来处理一组预定义的值。
一、什么是 Enum?
Enum(枚举) 就像是一个固定的"选项列表",它把一组相关的常量值组织在一起,让代码更清晰、更安全。
简单比喻:
想象一个选择题:
-
性别:男、女、未知
-
星期:周一、周二、...、周日
-
颜色:红、黄、蓝
这些固定的选项就是枚举的典型应用场景。
二、基本语法
最简单的枚举定义:
// 定义一个星期的枚举
public enum Weekday {
MONDAY, // 周一
TUESDAY, // 周二
WEDNESDAY, // 周三
THURSDAY, // 周四
FRIDAY, // 周五
SATURDAY, // 周六
SUNDAY // 周日
}
使用枚举:
public class Test {
public static void main(String[] args) {
// 声明一个枚举变量
Weekday today = Weekday.MONDAY;
// 使用枚举
if (today == Weekday.MONDAY) {
System.out.println("今天是周一,要上班!");
}
// 在switch中使用(特别适合)
switch (today) {
case MONDAY:
System.out.println("周一综合症");
break;
case FRIDAY:
System.out.println("周五了,开心!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("周末休息");
break;
default:
System.out.println("普通工作日");
}
}
}
三、枚举的特点
1. 类型安全
// 错误示例:用数字表示星期
int day = 1; // 1代表周一?容易混乱
day = 8; // 星期八?这明显不对,但编译器不会报错
// 正确示例:用枚举
Weekday today = Weekday.MONDAY;
// today = 8; // 编译错误!只能赋值Weekday中定义的常量
2. 代码清晰
// 不用枚举(魔法数字)
if (status == 1) { ... } // 1代表什么?不清楚
// 使用枚举
if (orderStatus == OrderStatus.PAID) { ... } // 一目了然
3. 预定义的值
枚举的值是固定的,不能在运行时修改:
Weekday.MONDAY = Weekday.TUESDAY; // 错误!不能修改枚举值
四、枚举的高级用法
1. 带属性和方法的枚举
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; // in kilograms
private final double radius; // in meters
// 枚举的构造函数(默认为 private)
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// 枚举的方法
public double getMass() {
return mass;
}
public double getRadius() {
return radius;
}
public double getSurfaceGravity() {
return G * mass / (radius * radius);
}
private static final double G = 6.67300E-11;
}
2. 实现接口的枚举
public interface Operation {
double apply(double x, double y);
}
public enum BasicOperation implements Operation {
PLUS("+") {
public double apply(double x, double y) { return x + y; }
},
MINUS("-") {
public double apply(double x, double y) { return x - y; }
},
TIMES("*") {
public double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
public double apply(double x, double y) { return x / y; }
};
private final String symbol;
BasicOperation(String symbol) {
this.symbol = symbol;
}
@Override
public String toString() {
return symbol;
}
}
3. 在 switch 语句中使用
public class EnumExample {
public void printDayMessage(Day day) {
switch (day) {
case MONDAY:
System.out.println("开始新的一周!");
break;
case FRIDAY:
System.out.println("周末快到了!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("周末愉快!");
break;
default:
System.out.println("工作日加油!");
}
}
}
五、常用的枚举方法
public class EnumMethodsExample {
public static void main(String[] args) {
// 获取所有枚举值
Day[] days = Day.values();
// 通过名称获取枚举值
Day monday = Day.valueOf("MONDAY");
// 获取枚举的名称
String name = Day.MONDAY.name();
// 获取枚举的位置(从0开始)
int ordinal = Day.MONDAY.ordinal();
// 比较枚举
boolean isBefore = Day.MONDAY.compareTo(Day.TUESDAY) < 0;
}
}
六、实际应用场景
-
状态管理:订单状态、任务状态等
-
配置选项:颜色主题、语言选项等
-
错误代码:定义系统的错误类型
-
菜单选项:应用程序的菜单项
七、最佳实践
-
使用枚举代替常量接口
-
为枚举值使用有意义的名称
-
考虑使用枚举来实现单例模式
-
在需要固定集合的地方优先使用枚举
328

被折叠的 条评论
为什么被折叠?



