如何比较两个枚举?

2 java

我有两个枚举:

public enum UserType {
    USER,
    EMPLOYER

}
Run Code Online (Sandbox Code Playgroud)
public enum UserDetails {
    USER,
    EMPLOYER
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下方式进行比较:

if(UserType.USER.equals(UserDetails.USER)){
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但我不能因为,我equals()把这个扔给我:

equals() between objects of inconvertible types 'UserType' and 'UserDetails'
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lex 5

尝试比较他们的名字

if(UserType.USER.name().equals(UserDetails.USER.name())){
    return true;
}
Run Code Online (Sandbox Code Playgroud)

阅读其他答案后,我决定给出更详细的答案。我必须同意这样的解决方案还不够好,因为它不是关于枚举 - 它是关于字符串比较。枚举可能会被更改,并且一切都将无法正常工作。好的。我认为可能有更好的解决方案 - 当然:

  • 仅使用一种类型的枚举 - 我认为这是完美的(但作者有不同的枚举)
  • 比较枚举的名称 - 好吧,它可以工作,但实际上不是“聪明”地使用枚举
  • 进行一些映射 - 为什么不 - 但它是两个不同枚举的硬链接,而且还不够好
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
}
Run Code Online (Sandbox Code Playgroud)

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

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


Bas*_*que 5

不同种类

Java 中enum是一个class,尽管是一种稍微特殊的 class。一个类定义了一个类型

除非通过继承接口相关,否则不能比较不同类型的相等性。AString不能等于 aLocalDate不能等于 a DataSource

同样, enum 的对象UserType不能等于 enum 的对象UserDetails苹果与橙子,根据定义不相等。因此,从技术上讲,您的问题毫无意义。

某些枚举类碰巧在其某些常量上共享名称这一事实没有意义,您的两个枚举共享名称USEREMPLOYER. Month与 Java 捆绑在一起的枚举定义了一个名为 的常量APRIL。我可能会使用一个名为 的对象定义另一个枚举APRIL。但这并不能使它们相等。

问这个问题表明你的设计有问题。如果已经在 Stack Overflow 上解决了该设计问题,也许您应该就该设计问题发布另一个问题。正如Kayaman评论的,您的问题似乎是一个XY 问题

建议您的其他答案:

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

……被误导了。这些方法违反了 Java 中枚举的目的,即提供在编译时已知的某些值的类型安全标识。

  • 如果您正在比较常量的名称,那么您最好只使用String对象而不是枚举。
  • 如果您正在比较序数,那么您最好只使用整数而不是枚举。

这两种情况都是脆弱的,如果您对一个枚举进行更改而不匹配另一个,则会导致运行时失败。在这两种情况下,您都失去了枚举的用处,将枚举转换为字符串或int.

  • @mentallurg 在没有技术问题的正式定义的情况下,作者如何理解平等测试的不兼容性? (3认同)
  • @mentallurg 的目的是解决枚举的类型安全问题。我们试图解释这是糟糕的设计。 (3认同)