在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 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值总是通过==进行比较,因为它们是单例。