Java中枚举(Enum)的多种使用方式及自定义枚举访问方法
Java枚举的使用方式及自定义枚举的访问方法
一、Java枚举的常见使用方式
- 定义固定常量集合:替代传统的int/String常量,用于表示有限的固定取值(如星期、季节),避免魔法值,保证类型安全。
- 作为switch分支条件:枚举类型可直接在switch中使用,比int/String更严谨,不会出现非法分支值。
- 带属性与方法的枚举:为枚举常量添加自定义属性、构造方法及业务方法,让枚举携带更多信息和行为,比如你定义的
DayOfWeek就带有label属性和getValue()方法。 - 实现接口:枚举可以实现接口,让不同枚举类遵循同一规范,例如定义
Displayable接口,让枚举实现统一的展示方法。 - 实现单例模式:利用JVM对枚举实例的唯一性和线程安全保障,简洁实现单例,比如
public enum Singleton { INSTANCE; },这是推荐的单例实现方案之一。 - 结合专用集合使用:使用
EnumSet或EnumMap这类为枚举优化的集合,比普通集合性能更高,例如EnumSet.of(DayOfWeek.SUNDAY, DayOfWeek.SATURDAY)可以快速创建周末集合。
二、DayOfWeek枚举的不同访问方式
- 直接访问枚举常量:通过类名加常量名直接获取实例:
DayOfWeek monday = DayOfWeek.MONDAY; - 通过
valueOf()方法获取:传入常量的字符串名称(大小写敏感),返回对应枚举实例:DayOfWeek tuesday = DayOfWeek.valueOf("TUESDAY"); - 通过
values()方法遍历所有常量:values()返回包含所有枚举常量的数组,用于遍历或批量处理:for (DayOfWeek day : DayOfWeek.values()) { System.out.println(day + " 的label值:" + day.getValue()); } - 通过自定义属性反向查找:给枚举添加静态方法,根据label值匹配对应的枚举实例,比如在
DayOfWeek中新增:
调用方式:public static DayOfWeek getByLabel(int label) { for (DayOfWeek day : values()) { if (day.label.equals(label)) { return day; } } throw new IllegalArgumentException("无效的label值:" + label); }DayOfWeek wednesday = DayOfWeek.getByLabel(3); - 通过
ordinal()获取默认顺序值:每个枚举常量有默认的顺序编号(从0开始),但不建议依赖该值,因为调整枚举常量顺序会导致ordinal()结果变化,你的自定义label属性更可靠:int sundayOrdinal = DayOfWeek.SUNDAY.ordinal(); // 返回0,与当前label值一致,但顺序调整后会改变
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

