Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举之间的共享方法_Java_Groovy_Enums - Fatal编程技术网

Java 枚举之间的共享方法

Java 枚举之间的共享方法,java,groovy,enums,Java,Groovy,Enums,我想在两个新的枚举中重构一个emun,但我不想在所有新的枚举中复制/粘贴枚举方法 enum EmailType { REMINDER_ADMIN('reminderForAdmin') REMINDER_PRODUCTION('reminderForProduction') REMINDER_MANAGEMENT('reminderForManagement') REMINDER_CUSTOMER('reminderForCustomer') priva

我想在两个新的枚举中重构一个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) {
        ...
    }

    ...
}

方法只能实现一次,并在多个枚举中使用?

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
类型无法做到这一点,但您可以使用Groovy
Mixin
s或带有接口的工厂:

  • 在枚举中,只需定义常量。所有枚举都必须实现公共标记接口
  • 创建一个接受marker接口并包含getter的工厂
  • 工厂方法允许您将配置(如模板、电子邮件地址)移动到工厂在启动时读取的配置文件中

    教训:不要将配置放入枚举中。枚举是常量。配置更改。

    最后,注释不起作用,因为
    @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,可以在一行中实现