java枚举解析
1. 枚举基础与核心特性
1.1 基本定义
枚举用于表示固定数量的常量,替代传统的public static final
常量:
public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
1.2 构造函数与属性
枚举可包含构造函数和属性,每个实例初始化时传入参数:
public enum Planet {MERCURY(3.303e+23, 2.4397e6),VENUS(4.869e+24, 6.0518e6);private final double mass;private final double radius;Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}// Getter方法 }
2. 高级用法与特性
2.1 行为抽象与多态
每个枚举实例可重写抽象方法,实现不同行为:
public enum Operation {PLUS {public double apply(double x, double y) { return x + y; }},MINUS {public double apply(double x, double y) { return x - y; }};public abstract double apply(double x, double y); }
2.2 实现接口
枚举可实现接口,统一方法签名:
public interface Command {void execute(); }public enum FileCommand implements Command {OPEN {public void execute() { /* 打开文件逻辑 */ }},SAVE {public void execute() { /* 保存文件逻辑 */ }}; }
2.3 枚举单例模式
线程安全且防反射攻击的单例实现:
public enum Singleton {INSTANCE;public void doWork() {System.out.println("单例工作...");} }
3. 实用工具类
3.1 EnumSet
高效处理枚举集合(基于位向量):
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
核心特性
基于位向量:内部用位(bit)表示枚举实例的存在性,内存占用极小,性能接近数组。
类型安全:只能存储同一枚举类型的值,避免类型错误。
快速操作:
contains
、add
、remove
等操作时间复杂度为 O(1)。应用场景
状态组合:如用户权限、开关配置。
批量处理:快速筛选或操作一组枚举值。
代码示例
public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }public class Main {public static void main(String[] args) {// 创建工作日集合EnumSet<Day> workDays = EnumSet.range(Day.MONDAY, Day.FRIDAY);System.out.println(workDays); // [MONDAY, TUESDAY, ..., FRIDAY]// 添加周末EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);workDays.addAll(weekend);System.out.println(workDays.contains(Day.SUNDAY)); // true// 快速补集操作(取非工作日的补集)EnumSet<Day> nonWorkDays = EnumSet.complementOf(workDays);} }关键点
使用
EnumSet.of()
或EnumSet.range()
快速初始化。适合需要频繁判断成员存在性的场景(如权限校验)。
3.2 EnumMap
键为枚举的优化Map实现:
EnumMap<Day, String> activities = new EnumMap<>(Day.class); activities.put(Day.MONDAY, "会议");
核心特性
数组存储:内部用枚举的
ordinal()
值作为数组索引,访问速度极快。键类型安全:键必须为同一枚举类型,值可以是任意类型。
内存高效:无需哈希计算,直接通过下标访问。
应用场景
分类存储:如按商品类型存储库存。
状态映射:如订单状态对应的处理逻辑。
代码示例
enum LogLevel {INFO, WARN, ERROR }public class Logger {private static final EnumMap<LogLevel, String> PREFIXES = new EnumMap<>(LogLevel.class);static {PREFIXES.put(LogLevel.INFO, "[INFO] ");PREFIXES.put(LogLevel.WARN, "[WARNING] ");PREFIXES.put(LogLevel.ERROR, "[ERROR] ");}public static void log(LogLevel level, String message) {System.out.println(PREFIXES.get(level) + message);} }// 使用示例 Logger.log(LogLevel.ERROR, "File not found!"); // 输出: [ERROR] File not found!关键点
初始化时需指定枚举类(
new EnumMap<>(LogLevel.class)
)。比
HashMap
更高效,尤其在频繁访问的场景。
4. 应用场景
4.1 状态机
用枚举表示状态及其转换:
public enum OrderStatus {NEW {public OrderStatus next() { return PROCESSING; }},PROCESSING {public OrderStatus next() { return SHIPPED; }},SHIPPED {public OrderStatus next() { return DELIVERED; }},DELIVERED {// 方案1:抛出异常public OrderStatus next() {throw new IllegalStateException("订单已送达,无法继续操作");}// 或方案2:返回自身// public OrderStatus next() { return DELIVERED; }}; ;public abstract OrderStatus next(); }
4.2 策略模式
枚举封装不同算法策略:
public enum Calculator {ADD((a, b) -> a + b),SUBTRACT((a, b) -> a - b);private final BinaryOperator<Integer> operation;Calculator(BinaryOperator<Integer> operation) {this.operation = operation;}public int calculate(int a, int b) {return operation.apply(a, b);} }
// 使用示例 int result = Calculator.ADD.calculate(3, 5); // 8
4.3 错误码管理
统一管理错误码和描述:
public enum ErrorCode {SUCCESS(200, "成功"),NOT_FOUND(404, "资源不存在");private final int code;private final String msg;ErrorCode(int code, String msg) {this.code = code;this.msg = msg;}// Getter方法 }
5. 新特性与Java 8+结合
Java 8的Lambda和Stream可增强枚举功能:
public enum FileType {TEXT(file -> file.endsWith(".txt")),IMAGE(file -> file.matches(".*\\.(png|jpg)"));private final Predicate<String> validator;FileType(Predicate<String> validator) {this.validator = validator;}public boolean validate(String fileName) {return validator.test(fileName);} }// 使用示例 boolean isImage = FileType.IMAGE.validate("photo.jpg");
总结
-
类型安全:避免魔法数字和字符串,增强代码可读性。
-
行为封装:通过抽象方法和接口实现多态。
-
设计模式:单例、策略、状态机等模式的优雅实现。
-
高效工具类:利用
EnumSet
和EnumMap
优化性能。
枚举在需要固定常量集且伴随复杂逻辑时尤其适用,是Java中强大而灵活的特性。
原文地址:https://blog.csdn.net/Vic10101/article/details/146233538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/94294.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/94294.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!