比较字符串与枚举

时间:2012-05-11 14:46:32

标签: java

我正在使用名为FindBugs的静态分析工具分析以下代码。

if(str.equals(enum.SOMEVALUE)) {// do something};

其中str是String,枚举是枚举。该工具为此代码生成以下警告,并声明

  

此方法在两个不同类类型的引用上调用equals(Object),没有公共子类。根据equals()的契约,不同类别的对象应该总是比较不等;因此,根据java.lang.Object.equals(Object)定义的契约,此比较的结果在运行时始终为false。

如果我用以下代码替换上面的代码:

if(str.equals(enum.SOMEVALUE.toString())) {// do something};
然后警告就消失了。但是我不确定该工具产生的警告是否真的是真的,我是否正确修复它?因为我以前见过这样的比较,看起来工作正常。

5 个答案:

答案 0 :(得分:18)

您的第一次比较基本上是错误。您正在比较完全不同类型的对象(StringEnum),它们永远不会相等。 甚至在这里给我一个警告。它只会编译,因为equals()接受Object,而不是String

第二个比较是正确

虽然JavaDoc is a bit harsh on name()方法,但实际上我建议在enum toString()覆盖的情况下使用它:

if(str.equals(FooEnum.SOMEVALUE.name()))

答案 1 :(得分:3)

我认为替换toString()的常量可能是正确的做法,我会将其更改为.name(),但因为要覆盖toString。

答案 2 :(得分:3)

你可以尝试

enum.SOMEVALUE.name()

因为它

  

返回此枚举常量的名称,与其枚举声明中声明的完全相同。

答案 3 :(得分:2)

我建议使用:

if (SomeEnum.SOMEVALUE == SomeEnum.valueOf(str)) {

}

答案 4 :(得分:1)

据我所知,你走的是正确的道路。

if(str.equals(enum.SOMEVALUE.toString())) {// do something};

这应该没问题。