编程Java高级开发者

Java中的enum是如何工作的,使用时有什么细节,以及为什么enum不仅仅是常量的简单集合?

用 Hintsage AI 助手通过面试

答案

在Java中,enum是一个类类型,继承自java.lang.Enum,表示一个有限的常量对象集合,但不仅仅局限于名称的集合:enum可以通过方法、字段、构造函数进行扩展,能够实现接口并添加行为。

示例:

enum Day { MONDAY("工作日"), SATURDAY("休息日"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "休息日"

细节:

  • Enum保证常量的唯一性:单例实例。
  • 可以实现接口。
  • 每个值都有自己的类(可以为每个值重写方法)。
  • Enum防止克隆和通过反射创建新实例。

设陷阱的问题

问题: "在enum中可以为某些enum值重写方法吗?如果可以 — 如何?"

常见错误: 错误地认为所有值的行为总是相同的。

正确答案: 是的,针对特定常量可以有特定实现。

示例:

enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }

由于对这一主题细节的不了解造成的实际错误示例


故事

在汽车管理系统中,使用enum存储状态,未实现额外字段以存储API代码 — 开发者试图通过继承扩展enum,但这被禁止。最终不得不重做状态存储模型。


故事

在一家在线商店,程序员用反射工具 "解包" 了带有私有构造函数的enum,以便为测试创建伪造实例,但收到了异常:enum被保护,无法创建新实例。CI未通过,测试失败。


故事

在一个旧项目中,enum的值通过equals()进行比较,而不是通过==。在反序列化时意外地出现了问题:enum值总是通过==进行比较,因为它们是单例。