web-dev-qa-db-ja.com

Integer.valueOf(String)を使用した「プリミティブを解析するためのボクシング/ボックス化解除」に関するFindbugsの問題

私はこのコードを持っています:

public void someMethod(String id) {
   someOtherMethod(Integer.valueOf(id));
}

public void someOtherMethod(int id) {
   // do something with id
}

そして、その2行目で、Findbugsはこの例外をスローしています:

プリミティブを解析するためのボクシング/アンボクシング

単にInteger.valueOf()を呼び出しているだけでFindbugsがこれについて文句を言うのはなぜですか?

27
mac

問題は、 _Integer.valueOf_Integerではなくintを返しますが、someOtherMethodintを期待することです。 Findbugsは基本的に、必要のないオブジェクト(Integer)を潜在的に作成し、それをsomeOtherMethod(int)、例:

 String => int => Integer => int 
 ^^^^^^^^^^^^^^ 
\---これはInteger.valueOf 

代わりに、Integerを介した不要なラウンドトリップを回避し、おそらく回避する必要があります。

 String => int 
 ^^^^^^^^^^^^^ 
\--- Integer.parseInt 

一時的なIntegerおよび潜在的なメモリ割り当てなど、それを取り囲む必要はありません。

someOtherMethodIntegerを予期している場合、Integerは一時的なものではないため、警告は表示されません。

これは、Findbugsやそのようなツールが有用に指摘している不要なボクシング変換のクラスの1つにすぎません。

48
T.J. Crowder

それを理解するにはしばらく時間がかかりました(一部はジェンキンスが「プリミティブを解析するためのボクシング/アンボクシング」と言ったためです)

Integer.valueOf(parseInt(s, 10));

そのため、解決策は単にparseInt()を直接呼び出すことです。

someOtherMethod(Integer.parseInt(id));

問題の詳細な説明(DM_BOXED_PRIMITIVE_FOR_PARSING)は findbugsページ にあります。

13
mac