在Eclipse中抑制FindBugs警告

我使用字符串作为锁,因此要确保对象是一个新实例。 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插件仍然将此报告为一个问题:

模式ID:DM_STRING_CTOR,类型:Dm,类别:PERFORMANCE

使用java.lang.String(String)构造函数会浪费内存,因为这样构造的对象在function上与作为参数传递的String无法区分。 只需直接使用参数String。

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

在没有看到你的其余代码的情况下,我可能会猜到你正在锁定对某种列表的访问。 您可以使用列表本身作为锁定对象。 如果它是私有的,则其他人不可能导致死锁。

正常的习惯是这样做:

 private final Object inputListLock = new Object(); 

这节省了空间(相对于new String("someLock") )并摆脱了讨厌的PMD警告。 但是如果你真的希望锁是一个String,还有其他方法来创建一个PMD不太可能反对的String副本; 例如

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

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

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

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