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

2024-04-14

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

EDIT:

好的,谢谢您的回答和评论。我同意我最初的想法违背了枚举的目的。我认为以下更改可以满足我的需求。

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);
       }
   }
}

在这种情况下,层次枚举技巧可能就是您想要的。虽然它不能解决比较问题,但它为您的问题提供了一个非常好的替代方案。

http://java.dzone.com/articles/enum-tricks-hierarchical-data http://java.dzone.com/articles/enum-tricks-hierarchical-data

我直接引用上面网站的代码,稍微简化一下:

public enum OsType {
    OS(null),
        Windows(OS),
            WindowsNT(Windows),
                WindowsNTWorkstation(WindowsNT),
                WindowsNTServer(WindowsNT),
            WindowsXp(Windows),
            WindowsVista(Windows),
            Windows7(Windows),
        Unix(OS),
            Linux(Unix),
    ;
    private OsType parent = null;

    private OsType(OsType parent) {
        this.parent = parent;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java 中定义重复的枚举常量? 的相关文章

随机推荐