实用枚举技术
带有自定义方法的枚举
为枚举常量添加行为
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) {
if (y == 0) throw new ArithmeticException("Division by zero");
return x / y;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public abstract double apply(double x, double y);
public String getSymbol() {
return symbol;
}
}
作为状态机的枚举
public enum TrafficLight {
RED {
@Override
public TrafficLight next() {
return GREEN;
}
},
GREEN {
@Override
public TrafficLight next() {
return YELLOW;
}
},
YELLOW {
@Override
public TrafficLight next() {
return RED;
}
};
public abstract TrafficLight next();
}
枚举单例模式
public enum DatabaseConnection {
INSTANCE;
private Connection connection;
private DatabaseConnection() {
// 初始化数据库连接
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb");
} catch (SQLException e) {
throw new RuntimeException("Database connection failed", e);
}
}
public Connection getConnection() {
return connection;
}
}
枚举技术比较
技术 |
使用场景 |
优点 |
局限性 |
自定义方法 |
复杂逻辑 |
灵活 |
可能增加复杂度 |
状态机 |
有限状态 |
转换清晰 |
限于预定义状态 |
单例 |
单实例 |
线程安全 |
不如基于类的单例灵活 |
带有泛型的枚举
public enum Converter<T> {
STRING_TO_INTEGER {
public Integer convert(String value) {
return Integer.parseInt(value);
}
},
STRING_TO_DOUBLE {
public Double convert(String value) {
return Double.parseDouble(value);
}
};
public abstract T convert(String value);
}
枚举工作流程
graph TD
A[枚举定义] --> B{技术类型}
B -->|自定义方法| C[添加特定行为]
B -->|状态机| D[定义状态转换]
B -->|单例| E[确保单实例]
C --> F[实现逻辑]
D --> F
E --> F
高级枚举技术
使用 EnumSet
import java.util.EnumSet;
public class EnumSetDemo {
enum Permissions {
READ, WRITE, EXECUTE, DELETE
}
public static void main(String[] args) {
EnumSet<Permissions> userPermissions = EnumSet.of(
Permissions.READ,
Permissions.WRITE
);
}
}
在 switch 语句中使用枚举
public class EnumSwitch {
public static void handleDay(DaysOfWeek day) {
switch (day) {
case SATURDAY:
case SUNDAY:
System.out.println("周末");
break;
default:
System.out.println("工作日");
}
}
}
最佳实践
- 将枚举用于类型安全的常量集合
- 在枚举中实现有意义的方法
- 利用枚举的内置特性
- 考虑性能和可读性
借助 LabEx 的全面指南,你可以掌握 Java 中的高级枚举技术,将编程技能提升到新的水平。