【发布时间】:2012-01-10 16:05:35
【问题描述】:
我有一个关于处理 Java 枚举时代码重用的最佳设计模式的问题。基本上,我想要实现的是能够定义几个模拟静态业务集合(常量集)的枚举,但我也希望在它们之间共享行为,并且使用最少的编码。
从抽象类继承类很容易实现,但是,由于 Java 枚举不能扩展(它们只能实现接口),这种类型的工作很乏味,并且涉及很多容易出错的复制/粘贴工作(复制从枚举到枚举的代码)。应该在所有枚举之间共享的“业务逻辑”示例包括从/到字符串转换、实例和逻辑比较等。
我现在最好的方法是将辅助类与业务接口结合使用,但这仅能降低代码复杂性(因为所有枚举仍然必须声明和调用辅助类)。见例子(只是为了澄清):
public enum MyEnum {
A, B, C;
// Just about any method fits the description - equals() is a mere example
public boolean equals(MyEnum that) {
ObjectUtils.equals(this, that);
}
}
StackOverflowers 如何处理这种“语言特性”?
【问题讨论】:
-
可以试试 Lombok 和
@Delegate,我从来没有用枚举尝试过。 -
在 Java 6 中,枚举是最终类;你不能扩展它们。我相信java 7是一样的。
-
枚举不是为此而生的:要么使用类(或带有枚举的类),要么分离逻辑;对于这样的情况,您可以使用工厂模式(如果枚举之间的行为足够不同)。
-
@DwB - 我知道枚举是最终的(问题中提到了)。我要问的是一种合法的 Java 设计模式,它可以缓解编写太多代码来解决这个问题的问题,从而保持 DRY。
-
@DaveNewton - Lombok 看起来很有趣(类似于 Spring Roo 的概念?)但它在构建链中引入了另一个工具。当前版本是 0.10.6,这对我来说是不行的。只是好奇,您是否自己将其部署到生产环境中?