Java 如何检查枚举值是否等于?

Java 如何检查枚举值是否等于?,java,enums,Java,Enums,如何检查枚举值的相等性?我尝试了以下方法,但失败了。为什么? class enum Test { LETTER("1A"); private String value; public Test(String value) { this.value = value; } @Override public void toString() { return value; } } String teststr

如何检查枚举值的相等性?我尝试了以下方法,但失败了。为什么?

class enum Test {
    LETTER("1A");

    private String value;
    public Test(String value) {
        this.value = value;
    }

    @Override
    public void toString() {
        return value;
    }
}


String teststring = "1A".
Sysout(teststring.equals(Test.LETTER)); //false. Why???

比较返回的是
false
,因为您正在将
String
实例与
Enum
实例进行比较

@RohitJain已经很好地解释了为什么在中的比较中没有调用
toString()
方法,以及如果您想这样做,应该如何使用它

但是,
toString()
不应用于比较目的,而应重写它以仅提供对象的自定义字符串表示形式

如果您这样做,您可以比较您真正感兴趣的属性:

String teststring = "1A".
Sysout(teststring.equals(Test.LETTER.getValue())); // Will return true
当然,您应该为
value
属性提供一个getter,或者让它对执行比较的操作可见

您还可以在
enum
中编写
isEqual()
方法,如下所示:

enum Test {
    LETTER("1A");

    private String value;
    private Test(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }

    public boolean isEqual(String value) { 
        return this.value.equals(value);
    }
}
只需执行
Test.LETTER.isEqual(teststring)
即可进行此比较

甚至可以使用
静态getByValue(String value)
方法来获取给定
值的枚举实例:

enum Test { 
    ...
    public static Test getByValue(String val) { 
        for (Test c : values()) {
            if (c.value.equals(val)) {
                return c;
            }
        }
    } 
} 

Test x = Test.getByValue("1A"); // x == Test.LETTER

只要按照下面的方法进行检查,它就会工作

teststring.equals(Test.LETTER.toString())

Test.LETTER
是一个枚举,因此它永远不会等于字符串,但它的值可以等于字符串,因此您必须直接使用枚举的值进行检查。

因为
String的equals
方法也在检查接收的对象是否为
String
。如果您尝试使用
Test.LETTER.toString()

它应该可以工作,因为您的代码中还有很多其他编译器错误:

  • 类枚举测试
    应为
    枚举测试
  • 枚举的构造函数只能是
    private
  • toString()
    方法的返回类型为
    void
    。这不是有效的覆盖。将返回类型设置为
    字符串
我不知道这些错误是否也存在于您的原始代码中,或者只是您的帖子中的一个错误

现在来谈具体问题。打印
enum
常量时,会自动调用该常量的
toString()
方法。因此,当您打印
Test.LETTER
时,您将得到
1A

当通过
Test.LETTER
作为任何方法的参数时,这是不正确的。您必须显式调用
toString()
。因此,这应该是:

System.out.println(teststring.equals(Test.LETTER.toString()));

另一种方法是在枚举本身中提供一个方法,它为特定字符串值获取一个
enum
常量:

public static Test of(String str) {
    for (Test test: values()) {
        if (test.value.equals(str)) {
            return test;
        }
    }
    return null;
}
您甚至可以缓存
values()
方法返回的数组,这样就不会一次又一次地创建它

然后只需比较枚举常量,如下所示:

String teststring = "1A";
System.out.println(Test.of(teststring) == Test.LETTER);

由于字符串对象和枚举实例之间的比较,这将返回false标志

如果您这样做:

String variable1 = "1A".
boolean flag = variable1.equals(Test.LETTER.value); 
system.out.println(flag);
这会回来的

True
尽管如此

在java中,.equals方法如下所示

public final boolean equals(Object other) { 
    return this==other;
}

我总是使用==因为它是空安全的。

“在java中,equals和==在逻辑上是相同的”这是完全错误的不同类有不同的
equals的实现。因为问题是关于
String.equals
的,所以您的陈述仍然是错误的。在比较
字符串时使用
==
而不是
equals
是一个错误。谢谢,当然这些错误在我的代码中不存在,只是一个(太)快速的输入错误。@RohitJain+1但实际上您提供的
函数可能会出现潜在问题。如果您有
字母_B(“1A”),字母(“1A”)
作为枚举常量,
Test.of(teststring)==Test.LETTER)
将返回
false
。(即使这个EnUM COSTANS实际上是愚蠢的,因为它们基本上是相同的)“ZouououHealth:这是真的,但是我不认为这些案例是比较的,正如你已经说过的,这些枚举将是愚蠢的。使用
==
比较枚举常量是完全可以接受的做法。请参阅@Rohit Jain“使用==来比较枚举常量是完全可以接受的做法。”-没错,但您是在使用
==
来比较
String
s。但这是另一个问题,返回单个对象的方法无法处理两个对象匹配条件的情况。@Holger Oops。那是我这边的一个错误。谢谢你指出这一点。