实现相同接口的两个枚举共享方法

时间:2015-08-12 14:05:37

标签: java enums

我有两个实现相同界面的枚举

public interface MetaEnum{
    String getDefaultValue();
    String getKey();
}

public enum A implements MetaEnum{
   ONE("1"), TWO("2");
   private String val;
   A(final v){
       val = v;
   }
   @Override
   public String getDefaultValue() {
       return value;
   }
   @Override
   public String getKey() {
        return (this.getClass().getPackage().getName() + "." + this.getClass().getSimpleName() + "." +
            this.toString()).toLowerCase();
   }
}

public enum B implements MetaEnum{
   UN("1"), DEUX("2");
   private String val;
   B(final v){
       val = v;
   }
   @Override
   public String getDefaultValue() {
       return value;
   }
   @Override
   public String getKey() {
        return (this.getClass().getPackage().getName() + "." + this.getClass().getSimpleName() + "." +
            this.toString()).toLowerCase();
   }
   ...other methods specific to this enum
}      

我有重复的代码,我想避免它。有没有办法在某种抽象类中实现getKey?我看了这个问题Java Enum as generic type in Enum,但它不能适应我的需要。

2 个答案:

答案 0 :(得分:4)

Java 8中的默认方法可以帮助你:) 此功能允许您在界面内实现方法。

public interface MetaEnum {
  String getValue();  

  default String getKey() {
    return (this.getClass().getPackage().getName() + "." + 
            this.getClass().getSimpleName() + "." +
            this.toString()).toLowerCase();
  }
}

很遗憾,您无法为getter实现default方法,因此您仍然会有一些重复的代码。

答案 1 :(得分:4)

将公共代码提取到单独的类:

class MetaEnumHelper {
   private String val;

   MetaEnumImpl(final v){
       val = v;
   }

   public String getDefaultValue() {
       return value;
   }

   public String getKey(MetaEnum metaEnum) {
        return (metaEnum.getClass().getPackage().getName() + "." + metaEnum.getClass().getSimpleName() + "." +
            metaEnum.toString()).toLowerCase();
   }
}

public enum A implements MetaEnum{
   ONE("1"), TWO("2");
   private MetaEnumHelper helper;
   A(final v){
       helper = new MetaEnumHelper(v);
   }
   @Override
   public String getDefaultValue() {
       return helper.getDefaultValue();
   }
   @Override
   public String getKey() {
        return helper.getKey(this);
   }
}

public enum B implements MetaEnum{
   UN("1"), DEUX("2");
   private MetaEnumHelper helper;
   B(final v){
       helper = new MetaEnumHelper(v);
   }
   @Override
   public String getDefaultValue() {
       return helper.getDefaultValue();
   }
   @Override
   public String getKey() {
       return helper.getKey(this);
   }
   ...other methods specific to this enum
}