我想用两个“值”相同的常量定义一个枚举类型。我称这两个常量为重复项。考虑以下示例:我想定义一个浏览器类型列表,并且我想同时拥有文字“IE”和“InternetExplorer”,如下所示:
enum Browser {
CHROME("chrome"),
FIREFOX("firefox"),
IE("ie"),
INTERNETEXPLORER("ie");
String type;
Browser(String type) {
this.type = type;
}
}
但是,有了这个,以下代码将失败,
Browser a = Browser.IE;
Browser b = Browser.INTERNETEXPLORER;
Assert.assertTrue(a==b);
我能想到的唯一解决方法是添加一个
value()
Browser
的方法返回浏览器实例内部值的类型。并且相等测试代码将是Assert.assertTrue(a.value()==b.value())
这不好。那么有人有更好的主意吗?
为什么 Java 不允许覆盖像
equals()
这样的方法的 Enum<T>
类(class)?编辑 :
好的,感谢您的回答和评论。我同意我最初的想法与枚举的目的背道而驰。我认为以下更改可以满足我的需要。
public enum Browser {
CHROME,
FIREFOX,
IE;
public static Browser valueOfType(String type) {
if (b == null) {
throw new IllegalArgumentException("No browser of type " + type);
switch (type.toLowerCase()) {
case "chrome":
return Browser.CHROME;
case "firefox":
return Browser.FIREFOX;
case "ie":
case "internetexplorer":
case "msie":
return Browser.IE;
default:
throw new IllegalArgumentException("No browser of type " + type);
}
}
}
最佳答案
每个枚举相互扩展类 Enum
定义 equals()
如 final
.这样做是因为 enum 不是常规类。 JVM 保证每个枚举元素都是唯一的,即在一个 JVM 中每个元素只存在一个实例。
例如,这是在 switch
中使用枚举所必需的。声明等
你想要做的是违背这个概念:你想要同一个枚举的 2 个相等的成员。
但是我可以为您提供其他解决方案:仅定义一个 IE
成员。定义 String[]
成员进入枚举和方法,可以通过任何别名找到合适的成员:
public enum Browser {
CHROME("Chrome"),
FIREFOX("FireFox"),
IE("IE", "MSIE", "Microsoft Internet Exporer"),
;
private String[] aliases;
private static Map<String, Browser> browsers = new HashMap<>();
static {
for (Browser b : Browser.values()) {
for (String alias : b.aliases) {
browsers.put(alias, b);
}
}
}
private Browser(String ... aliases) {
this.aliases = aliases;
}
public static Browser valueOfByAlias(String alias) {
Browser b = browsers.get(alias);
if (b == null) {
throw new IllegalArgumentException(
"No enum alias " + Browser.class.getCanonicalName() + "." + alias);
}
return b;
}
}
关于java - 如何在 Java 中定义重复的枚举常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511931/