java - 如何在 Java 中定义重复的枚举常量?

标签 java enums

我想用两个“值”相同的常量定义一个枚举类型。我称这两个常量为重复项。考虑以下示例:我想定义一个浏览器类型列表,并且我想同时拥有文字“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/

相关文章:

java - 使用 java 8 流查找平均值

java - 有没有办法指定使用 Quartz 库运行任务的持续时间

c - 在 .h 文件中声明结构并在 .c 文件中声明枚举

java - 读取枚举时出现空指针

unit-testing - 纠缠和测试枚举

java - 使用准备好的语句获取数据

java - 获取 RecyclerView.ViewHolder 中的上下文

java - Apache Kafka 是否能够处理事务?

Java 比较枚举器(奇怪的行为)

java - 解释 Enum 声明中使用的泛型