添加接口到groovy枚举?

时间:2016-09-17 03:04:37

标签: maven groovy

我无法将接口添加到groovy枚举。

示例:

interface DeviceType.groovy

public interface DeviceType{
    public String getDevice()
}

enum Device.groovy

public enum Devices implements DeviceType {

  PHONE{
       public String getDevice(){
          return "PHONE"
       }
  }, ALARM {
       public String getDevice(){
          return "ALARM"
       }
   }
}

简单测试

public class MainTest(){

  public static void main(String [] args) {
   System.out.println(Devices.PHONE.getDevice());
     //should print phone
     }
 }

这是伪代码,但是一个很好的例子。 当我在Groovy中使用它时,我从IntelliJ得到一个错误,我需要将接口抽象化。 如果我把它抽象化,maven就不会编译说它不能是静态的和最终的。

任何提示?

2 个答案:

答案 0 :(得分:2)

您需要在枚举中定义getDevice()。然后你可以覆盖它,如下所示:

enum Device.groovy

public enum Devices implements DeviceType {

  PHONE{
       public String getDevice(){
          return "PHONE"
       }
  }, ALARM {
       public String getDevice(){
          return "ALARM"
       }
  };

  public String getDevice(){
         throw new UnsupportedOperationException();
  }

}

答案 1 :(得分:1)

由于枚举是一个类,并且您的类正在实现该接口,因此需要实现该功能。现在你所拥有的是一个不实现该函数的枚举,其实例是每个具有相同名称功能的子类。但由于枚举本身没有它,这还不够好。

我想提供我喜欢的语法,例如:

public enum Devices implements DeviceType {
    PHONE("PHONE"), ALARM("ALARM")
    private final String devName
    public String getDevice() { return devName }
    private Devices(devName) { this.devName = devName }
}

或者,如果“设备”始终与枚举实例的名称匹配,您可能只返回:

public enum Devices implements DeviceType {
    PHONE, ALARM
    public String getDevice() { return name() }
}