15

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

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

其中 str 是一个字符串,而 enum 是一个枚举。该工具为此代码生成以下警告,并声明

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

如果我用这个替换上面的代码行:

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

然后警告消失。但我不确定该工具生成的警告是否真的是真的,以及我是否以正确的方式修复它?因为我以前见过这样的比较,它似乎工作正常。

4

5 回答 5

19

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

第二个比较是正确的。

尽管JavaDoc 对方法有点苛刻name(),但我实际上建议在给定枚举已被toString()覆盖的情况下使用它:

if(str.equals(FooEnum.SOMEVALUE.name()))
于 2012-05-11T14:49:18.470 回答
3

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

于 2012-05-11T14:50:10.947 回答
3

你可以试试

enum.SOMEVALUE.name()

因为它

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

于 2012-05-11T14:50:40.547 回答
2

我建议使用:

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

}
于 2012-05-11T14:49:20.420 回答
1

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

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

这应该没问题。

于 2012-05-11T14:50:27.050 回答