我正在使用名为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};
然后警告我disappears.But我不知道,如果该工具生成的警告是真的和我是否修复它正确的方式 ?因为我之前看到过这样的比较,它似乎正常工作。
非常感谢你的建议,使用的域名(),使我的电流id字段的做法,已经过时类似的情况。 – Bananeweizen
请注意,根据equals(),不同类型的对象肯定是相等的。 FindBugs和IntelliJ都是错误的。在标准的java API中甚至有一个例子:完成List接口的实现通过比较元素来实现equals,即使对于List的不同子类也是如此。 – herman
@herman:你说的对,但是'equals()'必须是* symmetrics *,这很容易用'List'实现完成(它们全部基于'AbstractList'),但不在OP情况下。 –