3

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

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???
4

5 回答 5

8

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

  • class enum Test应该是enum Test
  • 枚举的构造函数只能是private.
  • 方法的返回类型toString()void. 这不是一个有效的覆盖。制作返回类型String

我不知道这些错误是否也存在于您的原始代码中,或者这只是您帖子中的一个错误。

现在来具体问题。当您打印一个enum常量时,该toString()方法会自动调用它。所以,1A当你打印时你会得到Test.LETTER.

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);
于 2013-10-25T09:43:58.240 回答
6

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

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

但是,toString()不应将其用于比较目的,仅应将其覆盖以提供对象的自定义字符串表示。

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

String teststring = "1A".
Sysout(teststring.equals(Test.LETTER.getValue())); // Will return true

当然,您应该为value属性提供一个 getter,或者让它对进行比较的操作可见。

您也可以像这样编写一个isEqual()方法enum

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
于 2013-10-25T09:39:46.147 回答
1

只需按照以下方式进行检查即可

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

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

于 2013-10-25T09:39:52.013 回答
0

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

于 2013-10-25T09:39:54.133 回答
0

由于 String 对象和 ENUM 实例之间的比较,这将返回 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;
}

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

于 2013-10-25T09:45:45.987 回答