我正在使用名为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};
然后警告就消失了。但是我不确定该工具产生的警告是否真的是真的,我是否正确修复它?因为我以前见过这样的比较,看起来工作正常。
答案 0 :(得分:18)
您的第一次比较基本上是错误。您正在比较完全不同类型的对象(String
和Enum
),它们永远不会相等。 intellij甚至在这里给我一个警告。它只会编译,因为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};
这应该没问题。