如何比较两个枚举?

时间:2020-05-28 15:13:21

标签: java

我有两个枚举:

root.fetch("parentObj", JOIN.LEFT);
public enum UserType {
    USER,
    EMPLOYER

}

我尝试以此比较:

public enum UserDetails {
    USER,
    EMPLOYER
}

但是我不能,因为我的if(UserType.USER.equals(UserDetails.USER)){ return true; } 给我扔了:

equals()

那么,如何比较两个不同枚举中的两个值?

2 个答案:

答案 0 :(得分:5)

不同类型

enum in Javaclass,尽管是一种稍微特殊的类。一个类定义一个type

除非与inheritanceinterface相关,否则无法比较不同类型的相等性。 String不能等于LocalDate,而不能等于DataSource

同样,枚举UserType的对象不能等于枚举UserDetails的对象。 Apples to oranges,根据定义不相等。因此,从技术上讲,您的问题是毫无意义的。

某些枚举类恰巧在其某些常量上共享名称这一事实没有任何意义,这只是您两个枚举共享名称USEREMPLOYER的巧合。与Java捆绑在一起的枚举Month定义了一个名为APRIL的常量。我可以用一个也名为APRIL的对象定义另一个枚举。但这并不能使他们平等。

问这个问题表明您的设计有问题。也许您应该在该设计问题上发布另一个问题,如果该问题已经在Stack Overflow上解决了。作为commented by Kayaman,您的问题似乎像一个XY Problem

其他答案提示您

  • 比较枚举常量名称的字符串。
  • 比较常量在枚举定义中的序数位置。

...被误导了。这些方法违反了Java枚举的目的,即提供type-safe处已知值的compile-time标识。

  • 如果您要比较常量的名称,那么您可能只使用String对象而不是枚举。
  • 如果您要比较序数,那么您也可能只使用整数而不是枚举。

这两种情况都很脆弱,如果更改一个枚举而不匹配另一个枚举,则会导致运行时失败。在这两种情况下,您都失去了枚举的用处,将枚举转化为字符串或int的令人困惑的间接寻址级别。

答案 1 :(得分:4)

尝试比较他们的名字

if(UserType.USER.name().equals(UserDetails.USER.name())){
    return true;
}

阅读其他答案,我决定提供更多扩展答案。我必须同意,这样的解决方案还不够好,因为它与枚举无关-与字符串比较有关。枚举可能会更改,everythig将无法正常工作。好。 我认为可能会有更好的解决方案-当然:

  • 仅使用一种枚举-我认为这是完美的(但是作者有不同的枚举)
  • 比较枚举的名称-很好,但是确实不能“聪明地”使用枚举
  • 进行一些映射-为什么不做-但是它很难链接两个不同的枚举,并且还不够好
enum UserType {
   USER,
   EMPLOYER;

   public boolean isLike(UserDetails details) {
       switch (this) {
           case USER:
               return details == UserDetails.USER;
           case EMPLOYER:
               return details == UserDetails.EMPLOYER;
       }
       return false;
   }
}

enum UserDetails {
   USER,
   EMPLOYER;
}

if(UserType.USER.isLike(UserDetails.USER)){
           // do something
}

因此,我们看到没有比重写代码并只编写一个enum更好的决定了。但是一切都取决于问题:

  • 我们不知道为什么会有两个枚举-也许作者支持旧版代码
  • 我们不知道为什么作者必须比较这些不同的枚举
  • 提议的决定是否解决了这个具体问题-。好吗-