我正在编写一个库,该库具有一组预定义的枚举值。可以说,我的枚举如下所示。
public enum EnumClass {
FIRST("first"),
SECOND("second"),
THIRD("third");
private String httpMethodType;
}
现在,使用此库的客户端可能需要添加更多值。假设客户需要添加CUSTOM_FIRST
和CUSTOM_SECOND
。这不会覆盖任何现有值,而是使枚举具有5个值。
在此之后,我应该能够使用<? extends EnumClass>
5种不变的可能性。
实现此目标的最佳方法是什么?
您不能具有另一个enum
扩展enum
,也enum
不能通过继承将值“添加”到现有值。
但是,enum
可以实现interface
。
我要做的是让原始enum
实现标记interface
(即没有方法声明),然后您的客户端可以创建自己的enum
实现interface
。
然后,您的enum
价值观将被他们的共同点所引用interface
。
为了加强要求,您可以让介面宣告相关的方法,例如在您的情况下,在的行中public String getHTTPMethodType();
。
这将强制实现enum
s提供该方法的实现。
此设置加上适当的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
问题内容: 为什么Java中的枚举不能从其他枚举继承?为什么以这种方式实施? 问题答案: 例子 因为将元素添加到枚举将有效地创建超类,而不是子类。 考虑: 这与常规类的工作方式相反。我想可以以这种方式实施,但实施起来比看起来要复杂得多,而且肯定会使人们感到困惑。
问题内容: 您可以在Swift中继承枚举吗?关于枚举继承,应该注意哪些规则? 以下测试代码: 产生 问题答案: 在Swift语言中,我们有Structs,Enum和Classs。Struct和Enum通过副本传递,而类通过引用传递。只有类支持继承,枚举和结构不支持。 因此,要回答您的问题,您不能继承Enum(和Struct类型)。在这里看看:
你能在Swift中继承枚举吗?关于枚举继承,应该知道哪些规则? 以下测试代码: 产生
问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S
例如,我如何做类似的事情: 结果示例: