Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较两个枚举?_Java - Fatal编程技术网

Java 如何比较两个枚举?

Java 如何比较两个枚举?,java,Java,我有两个枚举: public enum UserType { USER, EMPLOYER } 我试着通过以下方式来比较: if(UserType.USER.equals(UserDetails.USER)){ return true; } 但我不能,因为我的equals()给了我这个: equals() between objects of inconvertible types 'UserType' and 'UserDetails' 那么,如何比较两个不同枚

我有两个枚举:

public enum UserType {
    USER,
    EMPLOYER

}
我试着通过以下方式来比较:

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

equals() between objects of inconvertible types 'UserType' and 'UserDetails'

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

尝试比较它们的名称

if(UserType.USER.name().equals(UserDetails.USER.name())){
    return true;
}
阅读其他答案后,我决定给出更详细的答案。我必须同意这样的解决方案是不够好的,因为它不是关于枚举的,而是关于字符串比较的。枚举可能会被更改,并且所有项都无法正常工作。好啊 我认为可以有更好的解决办法——当然:

  • 只使用一种枚举类型-我认为它是完美的(但作者有不同的枚举)
  • 比较枚举的名称——虽然它可以工作,但使用枚举并不“聪明”
  • 做一些映射——为什么不做呢——但这是两个不同枚举的硬链接,不够好
所以我们看到,没有比重写代码并只生成一个
enum
更好的决定了。但一切都取决于问题:

  • 我们不知道为什么会有两个枚举-可能是作者支持遗留代码
  • 我们不知道作者为什么要比较这些不同的枚举
  • 提议的决定解决了这个具体问题吗?是。好吗-不好
不同类型 这是一个,尽管有点特殊的类。类定义了一个类

除非与或相关,否则无法比较不同类型的相等性。
字符串
不能等于
LocalDate
,后者不能等于
数据源

同样,enum
UserType
的对象不能等于enum
UserDetails
的对象,定义上不相等。所以,从技术上讲,你的问题毫无意义

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

问这个问题表明你的设计有问题。如果这个设计问题已经在堆栈溢出上得到了解决,也许您应该发布另一个关于这个设计问题的问题。正如我所说,你的问题似乎是一个问题

其他答案建议你:

  • 比较枚举常量名称的字符串
  • 比较枚举定义中常量的顺序位置
…被误导了。这些方法违反了Java中枚举的目的,即提供已知的某些值的标识

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

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

你不能,他们是不同类型的。你希望如何比较它们?你的最终目标是什么?仅仅因为它们的名字相同并不意味着它们是相同的。你不应该首先做这样的比较,它是一种设计气味。对我来说听起来像是奇怪的设计。@ Munalurg,这是最不重要的事情。如果你用你的<代码> @ RequestParam <代码>解释了你正在做什么,那么也许有一个比你正在做的更好的解决方案。这已经写满了它。是的,这是可能的。但是以这种方式使用
enum
是很奇怪的。这表明这些可能是同一类型,而不是两种不同的类型。或者某种“聪明”地使用enum。@Alex我建议你在回答中加入对你的评论的讨论。我还建议在您当前的答案中添加一条注释,即比较枚举名称是使用Java枚举的一种奇怪而笨拙的方式。请尽量不要太正式,并尽量理解其意图。目的是建立某种等价关系。是的,如果公式不完美的话。但是目标是明确的。@mentalurg作者如何理解平等测试的不兼容性,而没有对技术问题的正式定义?@mentalurg的目的是围绕enum的类型安全展开工作。我们试图解释这是拙劣的设计。@BasilBourque:“其他答案……被误导了”-这是不正确的。请求中的枚举(例如,在REST控制器中)确保只能将预定义值作为参数传递。另一方面,还有使用独立类(包括枚举)的业务逻辑。在最简单的情况下(或在项目的初始阶段),这些枚举包含相同的常量。我不需要解释为什么我们不想混合不同的层。因此,要从REST控制器调用服务,您需要将值从一个枚举映射到另一个…@mentalurg可能您不理解。实体不属于控制器,但是
enum
s可以去任何地方。例如,您不需要
ControllerEnum.FOO
JPAEnum.FOO
。它们都是相同的
FOO
。我不知道你的“扩展枚举”故事是什么。它们不应该如此复杂,以至于开发人员需要1天来做任何事情。听起来你可能有严重的设计问题,而不仅仅是设计气味。
if(UserType.USER.name().equals(UserDetails.USER.name())){
    return true;
}
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
}