枚举的本质
- 枚举是一组业务相关的常量集。
- 在Java中,枚举是继承自
java.lang.Enum
的final类。 - 枚举值是静态的、不可修改的、公有的常量。
枚举的定义与特性
- 枚举值命名使用大写字母加下划线的方式。
- 枚举类可以包含成员变量、构造函数、方法。
- 枚举值之间使用
==
进行比较,比较的是内存地址。 - 枚举类可以序列化,但需要特别注意其序列化机制。
枚举的字节码分析
- 枚举类在编译后会生成额外的
values
和valueOf
方法。 values
方法返回枚举类型的所有值的数组。valueOf
方法根据名称返回对应的枚举值。
枚举的使用模式
- 基础使用:定义枚举类型并使用其常量。
- 作为内部类:在类内部定义枚举,增强封装性。
- 覆盖
toString()
方法:根据需要返回更友好的字符串表示。 - 使用构造函数:为枚举添加自定义字段和构造函数。
- 定义抽象方法:枚举可以实现抽象方法,每个枚举常量提供具体实现。
- 实现接口:枚举可以像普通类一样实现接口。
枚举的高级使用
- 单元素枚举实现单例模式:每个枚举元素都是单例。
- 添加自定义方法:枚举可以添加工具方法。
- 使用静态代码块:初始化静态变量或执行其他静态初始化逻辑。
- 无实例枚举:作为工具类使用,类似于
public final class
。
枚举与泛型
- 枚举可以用作泛型的限定类型,确保类型安全。
枚举的多态性
- 枚举可以实现接口,展示多态性。
枚举与配置
- 枚举的字段可以引用配置文件中的值,通过自定义字段的读取方法实现。
枚举的比较与排序
compareTo
方法用于比较枚举值,基于它们在枚举中声明的顺序。
测试用例
- 测试枚举的
name()
、ordinal()
方法和compareTo
方法。
示例代码
- 枚举定义示例,包括自定义方法和实现接口的示例。
- 枚举与单例模式的结合使用。
- 枚举作为工具类使用。
注意点
- 枚举常量不可变,但可以在枚举类中增加自定义的可变字段,尽管不推荐这样做。
- 枚举的构造函数是私有的,通过枚举常量隐式调用。
结语
- 枚举不仅仅是简单的常量集合,它们是功能丰富的类,可以实现多种设计模式和编程技巧。
思考
我写了这么多,你看了这么久,下面result应该是几呢?(先不看答案)
@Test
void testOrdinal() {
Season spring = Season.SPRING;
Season summer = Season.SUMMER;
int result = spring.compareTo(summer);
System.out.println(result); // result == ?
}
compareTo
方法比较的是枚举常量的声明顺序,spring.compareTo(summer)
的结果取决于SPRING
和SUMMER
在枚举中的定义顺序。如果SPRING
在SUMMER
之前定义,则结果为负;反之则为正。