3

我使用字符串作为锁,所以想确保对象是一个新实例。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) 构造函数会浪费内存,因为这样构造的对象在功能上与作为参数传递的 String 没有区别。直接使用参数 String 即可。
4

3 回答 3

5

为什么不直接将锁对象声明为新对象?你不需要把它变成一个字符串,因为你不做任何需要锁的字符串性的事情,并且假设你不会将它用于除锁定之外的任何事情。

在没有看到您的其余代码的情况下,我可能会猜测您正在锁定对某种列表的访问权限。您可以将列表本身用作锁定对象。如果它是私有的,那么其他人就不可能造成死锁。

于 2010-10-20T09:56:23.260 回答
2

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

private final Object inputListLock = new Object();

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

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

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

于 2010-10-20T09:56:13.807 回答
1

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

我已经寻找了一段时间,但没有发现任何信息表明 SuppressWarnings 可能仅适用于类和方法。我也没有找到任何将其应用于成员变量的示例。因此,尽管这个解决方案有效,但我不知道它是“正确”的解决方案(例如,我的 FindBugs/Eclipse 设置可能仍然存在问题)。

于 2010-10-22T07:12:22.083 回答