比较字符串与枚举

com*_*ose 14 java

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

if(str.equals(enum.SOMEVALUE)) {// do something};
Run Code Online (Sandbox Code Playgroud)

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

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

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

if(str.equals(enum.SOMEVALUE.toString())) {// do something};
Run Code Online (Sandbox Code Playgroud)

然后警告消失.但我不确定该工具产生的警告是否真的是真的,我是否正确修复它?因为我以前见过这样的比较,看起来工作正常.

Tom*_*icz 18

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

第二个比较是正确的.

虽然JavaDoc对name()方法有点苛刻,但实际上我建议使用它,以防枚举有toString()覆盖:

if(str.equals(FooEnum.SOMEVALUE.name()))
Run Code Online (Sandbox Code Playgroud)