枚举之间的共享方法

Art*_*ero 7 java groovy enums

我想在两个新的枚举中重构一个emun,但我不喜欢在所有新的枚举中复制/粘贴枚举方法.

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) {
        ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

有可能只实现一次方法并在几个枚举中使用?

enum EmailTypeAdministration {
    REMINDER_ADMIN('reminderForAdmin')
    REMINDER_PRODUCTION('reminderForProduction')

    ...
}

enum EmailTypeClients {
    REMINDER_MANAGEMENT('reminderForManagement')
    REMINDER_CUSTOMER('reminderForCustomer')

    ...
}
Run Code Online (Sandbox Code Playgroud)

Dón*_*nal 9

正如我的老朋友Clippy所说,"看起来你正在使用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')
Run Code Online (Sandbox Code Playgroud)

您可以在Groovy控制台中运行上面的代码,以证明它的工作方式与广告一样


Art*_*ero 2

最后,Mixin 解决方案不起作用,因为@Mixin注释仅适用于类而不是枚举。

我对委托使用类似的方法。委托转换效果很好!可以改进此代码以将 EnumUtils 与工厂或单例模式一起使用。

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')
Run Code Online (Sandbox Code Playgroud)