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を直接使用してください。
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 に答える