如何检查枚举值的相等性?

4

我怎样才能检查枚举类型的值是否相等?我尝试了以下方法,但它失败了。为什么?

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???
5个回答

8

你的代码中还有很多其他编译错误:

  • class enum Test 应该改为 enum Test
  • 枚举类型的构造函数只能为 private
  • toString() 方法的返回类型是 void,这不是有效的方法覆盖。应将返回类型更改为 String

我不知道这些错误是否也存在于你的原始代码中,或者只是在你的帖子中出现了错误。

现在来到具体问题。当你打印一个 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);

谢谢,当然这些错误在我的代码中并不存在,只是一个(太)快的打字错误。 - membersound
1
@RohitJain +1 但是实际上,您提供的of函数可能会出现潜在问题。如果您有LETTER_B("1A"), LETTER("1A");作为枚举常量,则Test.of(teststring) == Test.LETTER)将返回false。(即使这些枚举常量实际上很愚蠢,因为它们基本上是相同的) - Alexis C.
@ZouZou 嗯,那是真的,但我认为与之相比不应考虑这些情况,就像你已经说过的,这些枚举会很愚蠢。使用“==”来比较枚举常量是完全可以接受的做法。请参见此帖子 - Rohit Jain
1
“使用 == 比较枚举常量是完全可接受的做法。”这是正确的,但您正在使用 == 比较 String。但这是一个不同的问题,一个返回单个对象的方法无法处理两个对象匹配条件的情况。 - Holger
@Holger 哎呀,这是我的疏忽。感谢您指出来。 - Rohit Jain

6
比较返回了“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)即可进行此比较。

或者使用static getByValue(String value)方法获取给定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

1

只需按照以下方式进行检查,它就能正常工作。

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

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


0

这将返回 false 标志,因为它比较了 String 对象和 ENUM 实例。

如果你这样做:

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和==在逻辑上是相同的这种说法是完全错误的。 - Holger
不同的类有不同的 equals 实现。由于问题涉及到 String.equals,因此您的说法是错误的。在比较字符串时使用 == 而不是 equals 是一个错误。 - Holger

0
因为String的equals方法检查接收到的对象也必须是String。如果您尝试使用Test.LETTER.toString(),它应该可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接