如何启用枚举继承

新手上路,请多包涵

我正在写一个库,它有一组预定义的枚举值。比方说,我的枚举如下所示。

 public enum EnumClass {
    FIRST("first"),
    SECOND("second"),
    THIRD("third");

    private String httpMethodType;

}

现在使用这个库的客户可能需要添加更多的值。比方说,客户端需要添加 CUSTOM_FIRSTCUSTOM_SECOND 。这不会覆盖任何现有值,而是使枚举具有 5 个值。

在此之后,我应该能够使用类似 <? extends EnumClass> 的东西来获得 5 种不变的可能性。

实现这一目标的最佳方法是什么?

原文由 Kiran A B 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 348
2 个回答

你不能有一个 enum 扩展另一个 enum ,你不能通过继承将值“添加”到现有的 enum

然而, enum s可以实现 interface s。

我要做的是让原始的 enum 实现一个标记 interface (即没有方法声明),然后你的客户可以创建自己的 enum interface c2d4- ---

然后你的 enum 值将由它们的公共 interface

为了加强要求,您可以让您的接口声明相关方法,例如,在您的情况下,在 public String getHTTPMethodType(); 行中的内容。

这将强制实施 enum 以提供该方法的实施。

此设置加上足够的 API 文档应该有助于以相对可控的方式添加功能。

自包含示例(不要介意这里的惰性名称)

 package test;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<HTTPMethodConvertible> blah = new ArrayList<>();
        blah.add(LibraryEnum.FIRST);
        blah.add(ClientEnum.BLABLABLA);
        for (HTTPMethodConvertible element: blah) {
            System.out.println(element.getHTTPMethodType());
        }
    }

    static interface HTTPMethodConvertible {
        public String getHTTPMethodType();
    }
    static enum LibraryEnum implements HTTPMethodConvertible {
        FIRST("first"),
        SECOND("second"),
        THIRD("third");
        String httpMethodType;
        LibraryEnum(String s) {
            httpMethodType = s;
        }
        public String getHTTPMethodType() {
            return httpMethodType;
        }
    }
    static enum ClientEnum implements HTTPMethodConvertible {
        FOO("GET"),BAR("PUT"),BLAH("OPTIONS"),MEH("DELETE"),BLABLABLA("POST");
        String httpMethodType;
        ClientEnum(String s){
            httpMethodType = s;
        }
        public String getHTTPMethodType() {
            return httpMethodType;
        }
    }
}

输出

first
POST

原文由 Mena 发布,翻译遵循 CC BY-SA 3.0 许可协议

枚举不可扩展。简单的解决你的问题

  • 把枚举放在一个班级里
  • 为预定义类型创建常量
  • 如果您想要替换 Enum.valueOf :在静态映射中跟踪该类的所有实例

例如:

 public class MyType {
    private static final HashMap<String,MyType> map = new HashMap<>();
    private String name;
    private String httpMethodType;

    // replacement for Enum.valueOf
    public static MyType valueOf(String name) {
         return map.get(name);
    }

    public MyType(String  name, String httpMethodType) {
         this.name = name;
         this.httpMethodType = httpMethodType;
         map.put(name, this);
    }

    // accessors
    public String name() { return name; }
    public String httpMethodType() { return httpMethodType; }

    // predefined constants
    public static final MyType FIRST = new MyType("FIRST", "first");
    public static final MyType SECOND = new MyType("SECOND", "second");
    ...
}

原文由 wero 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题