在Eclipse中抑制FindBugs警告

时间:2010-10-20 09:19:48

标签: java eclipse findbugs suppress-warnings

我使用字符串作为锁,因此要确保该对象是一个新实例。 FindBugs抱怨,因为直接定义字符串通常更有效(使用双引号)。我的代码如下:

/** A lock for the list of inputs. */
@edu.umd.cs.findbugs.annotations.SuppressWarnings("DM_STRING_CTOR")
//We want a new String object here as this is a lock.
private final Object inputListLock = new String("inputListLock");

我在这里做错了吗? Eclipse FindBugs插件仍然将此报告为一个问题:

Pattern id: DM_STRING_CTOR, type: Dm, category: PERFORMANCE

Using the java.lang.String(String) constructor wastes memory because the object so constructed will be functionally indistinguishable from the String passed as a parameter.  Just use the argument String directly.

3 个答案:

答案 0 :(得分:5)

为什么不将lock对象声明为新对象?你不需要把它变成一个字符串,因为你不做任何需要锁定字符串的事情,并且你不会将它用于锁定以外的任何东西。

如果没有看到你的其余代码,我可能会猜到你正在锁定对某种列表的访问。您可以使用列表本身作为锁定对象。如果它是私有的,那么其他人就不可能造成僵局。

答案 1 :(得分:2)

正常的习惯用法是这样做:

private final Object inputListLock = new Object();

节省了空间(相对于new String("someLock"))并摆脱了令人讨厌的PMD警告。但是,如果确实希望锁定为String,则还有其他方法可以创建PMD不太可能反对的String副本;例如

private final Object inputListLock = "some".concat("Lock");

(注意"someLock".concat("")实际上并没有创建新的字符串!)

答案 2 :(得分:1)

好的,所以尽管其他答案都很有趣且有用(两者都是+1),但我最终没有改变代码,我将接受我自己的答案。为了满足FindBugs,我将注释从成员变量移动到了周围的类。

我已经找了一些时间,但我没有找到任何信息表明SuppressWarnings可能只适用于类和方法。我也没有找到任何应​​用于成员变量的例子。因此,虽然这个解决方案有效但我不知道它是'正确'的解决方案(例如,我的FindBugs / Eclipse设置可能还有问题)。