Java 枚举之间的共享方法
我想在两个新的枚举中重构一个emun,但我不想在所有新的枚举中复制/粘贴枚举方法Java 枚举之间的共享方法,java,groovy,enums,Java,Groovy,Enums,我想在两个新的枚举中重构一个emun,但我不想在所有新的枚举中复制/粘贴枚举方法 enum EmailType { REMINDER_ADMIN('reminderForAdmin') REMINDER_PRODUCTION('reminderForProduction') REMINDER_MANAGEMENT('reminderForManagement') REMINDER_CUSTOMER('reminderForCustomer') priva
enum EmailType {
REMINDER_ADMIN('reminderForAdmin')
REMINDER_PRODUCTION('reminderForProduction')
REMINDER_MANAGEMENT('reminderForManagement')
REMINDER_CUSTOMER('reminderForCustomer')
private final propertiesIdentifier
String getTemplate(type) {
...
}
String getFrom(type) {
...
}
String getTo(type) {
...
}
String getBcc(type) {
...
}
...
}
方法只能实现一次,并在多个枚举中使用?
enum EmailTypeAdministration {
REMINDER_ADMIN('reminderForAdmin')
REMINDER_PRODUCTION('reminderForProduction')
...
}
enum EmailTypeClients {
REMINDER_MANAGEMENT('reminderForManagement')
REMINDER_CUSTOMER('reminderForCustomer')
...
}
枚举无法扩展任何其他类,因为所有枚举都会自动扩展名为
Enum
的类。因此,您唯一的选择是将方法实现委托给单独的实用程序。如果实现不是微不足道的(不止一行),这可能是相关的。否则,授权不会给您带来严重的好处
另一种可能是手动扩展Enum,但我已经准备好编写详细的代码,如valueOf()
,values()
等,所以我不确定您是否真的需要它
编辑:
看一看我的文章关于。它可能也能帮助您。正如我的老朋友所说,“看起来您正在使用Groovy”。如果是这样,您可以使用mixin将公共方法添加到两个枚举中
// This class holds the methods that will be mixed-in to the enums
class EnumUtils {
String getTemplate(type) {
"template" + type
}
String getFrom(type) {
}
String getTo(type) {
}
String getBcc(type) {
}
}
// This annotation adds the common methods to the enum
@Mixin(EnumUtils)
enum EmailTypeAdministration {
REMINDER_ADMIN('reminderForAdmin'),
REMINDER_PRODUCTION('reminderForProduction')
EmailTypeAdministration(str) {}
}
// This annotation adds the common methods to the enum
@Mixin(EnumUtils)
enum EmailTypeClients {
REMINDER_MANAGEMENT('reminderForManagement'),
REMINDER_CUSTOMER('reminderForCustomer')
EmailTypeClients(str) {}
}
// Quick test to prove the methods exist and return the expected values
EmailTypeAdministration emailTypeAdmin = EmailTypeAdministration.REMINDER_ADMIN
assert 'templateParam' == emailTypeAdmin.getTemplate('Param')
您可以在Groovy控制台中运行上面的代码,以证明它可以按照公布的方式工作,
Enum
类型无法做到这一点,但您可以使用GroovyMixin
s或带有接口的工厂:
@Mixin
注释只对类而不是枚举起作用
我对委托使用类似的方法。很好!可以对该代码进行改进,以便将enumultils与工厂模式或单例模式一起使用
class EnumUtils {
String getTemplate(type) {
"template" + type
}
String getFrom(type) {
}
String getTo(type) {
}
String getBcc(type) {
}
}
enum EmailTypeAdministration {
REMINDER_ADMIN('reminderForAdmin'),
REMINDER_PRODUCTION('reminderForProduction')
@Delegate EnumUtils enumUtils = new EnumUtils()
EmailTypeAdministration(str) {}
}
enum EmailTypeClients {
REMINDER_MANAGEMENT('reminderForManagement'),
REMINDER_CUSTOMER('reminderForCustomer')
@Delegate EnumUtils enumUtils = new EnumUtils()
EmailTypeClients(str) {}
}
EmailTypeAdministration emailTypeAdmin = EmailTypeAdministration.REMINDER_ADMIN
assert 'templateParam' == emailTypeAdmin.getTemplate('Param')
它认为这是不可能的,但是您的枚举可以实现相同的接口,因此您可以通过接口访问方法。我无法让它运行。。。它在什么版本下工作?很有趣,我想也可以使用@Delegate@Don古怪的1.8.0-1.8.4、1.7.10或1.7.6(我唯一尝试过的)对我不起作用。。。我只是问了一下,因为我正在寻找一个类似的解决方案,但无法让它发挥作用。。。你是Java 6吗?@tim_yates这里发生了一些有趣的事情。我在Groovy web控制台中尝试了它(不知道正在运行的Groovy版本),得到了奇怪的错误消息
Groovy.lang.MissingMethodException:没有方法签名:EmailTypeAdministration.getTemplate()适用于参数类型:(java.lang.String)值:[Param]可能的解决方案:getTemplate(java.lang.Object)
@Mixin仅适用于类而不是枚举?如果将enum-EmailTypeAdministration
替换为class-EmailTypeAdministration
可以正常工作,但现在我没有需要的枚举。谢谢,我正在使用Groovy,可以在一行中实现