当前位置: 首页 > news >正文

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)表示枚举实例的存在性,内存占用极小,性能接近数组。

  • 类型安全:只能存储同一枚举类型的值,避免类型错误。

  • 快速操作containsaddremove 等操作时间复杂度为 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");

总结

  • 类型安全:避免魔法数字和字符串,增强代码可读性。

  • 行为封装:通过抽象方法和接口实现多态。

  • 设计模式:单例、策略、状态机等模式的优雅实现。

  • 高效工具类:利用EnumSetEnumMap优化性能。

枚举在需要固定常量集且伴随复杂逻辑时尤其适用,是Java中强大而灵活的特性。

原文地址:https://blog.csdn.net/Vic10101/article/details/146233538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/94294.html

相关文章:

  • 2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈
  • 大模型在原发性急性闭角型青光眼预测及治疗方案制定中的应用研究报告
  • 基于Python的selenium入门超详细教程(第1章)--WebDriver API篇
  • 电子元器件选型与实战应用—16 怎么选一个合适的MCU芯片?
  • 【算法】数据结构
  • 专题三x的平方根
  • python-leetcode-最大连续1的个数 III
  • 网关的详细介绍
  • springboot436-基于SpringBoot的汽车票网上预订系统(源码+数据库+纯前后端分离+部署讲解等)
  • 【Linux指北】Linux的重定向与管道
  • ubuntu软件——视频、截图、图片、菜单自定义等
  • 扩散模型中三种加入条件的方式:Vanilla Guidance,Classifier Guidance 以及 Classifier-Free Guidance
  • 状态模式的C++实现示例
  • 【具身相关】legged_gym, isaacgym、rsl_rl关系梳理及相关笔记
  • Python规则引擎DIY:从零开始构建规则引擎
  • [Ai 力扣题单] 数组基本操作篇 27/704/344
  • [C语言笔记]07、数组
  • 数据结构--【栈与队列】笔记
  • 【自学笔记】MoonBit语言基础知识点总览-持续更新
  • WPF 与 GMap.NET 结合实现雷达目标动态显示与地图绘制