私はこのコードを持っています:
public void someMethod(String id) {
someOtherMethod(Integer.valueOf(id));
}
public void someOtherMethod(int id) {
// do something with id
}
そして、その2行目で、Findbugsはこの例外をスローしています:
プリミティブを解析するためのボクシング/アンボクシング
単にInteger.valueOf()を呼び出しているだけでFindbugsがこれについて文句を言うのはなぜですか?
問題は、 _Integer.valueOf
_ はInteger
ではなくint
を返しますが、someOtherMethod
はint
を期待することです。 Findbugsは基本的に、必要のないオブジェクト(Integer
)を潜在的に作成し、それをsomeOtherMethod(int)
、例:
String => int => Integer => int ^^^^^^^^^^^^^^ \---これはInteger.valueOf
代わりに、Integer
を介した不要なラウンドトリップを回避し、おそらく回避する必要があります。
String => int ^^^^^^^^^^^^^ \--- Integer.parseInt
一時的なInteger
および潜在的なメモリ割り当てなど、それを取り囲む必要はありません。
someOtherMethod
がInteger
を予期している場合、Integer
は一時的なものではないため、警告は表示されません。
これは、Findbugsやそのようなツールが有用に指摘している不要なボクシング変換のクラスの1つにすぎません。
それを理解するにはしばらく時間がかかりました(一部はジェンキンスが「プリミティブを解析するためのボクシング/アンボクシング」と言ったためです)
Integer.valueOf(parseInt(s, 10));
そのため、解決策は単にparseInt()を直接呼び出すことです。
someOtherMethod(Integer.parseInt(id));
問題の詳細な説明(DM_BOXED_PRIMITIVE_FOR_PARSING)は findbugsページ にあります。