mac*_*mac 29 java boxing unboxing findbugs
我有这段代码:
public void someMethod(String id) {
someOtherMethod(Integer.valueOf(id));
}
public void someOtherMethod(int id) {
// do something with id
}
Run Code Online (Sandbox Code Playgroud)
在第二行,Findbugs抛出了这个异常:
用于解析基元的装箱/拆箱
当我只是调用Integer.valueOf()/我该如何解决这个问题时,为什么Findbugs抱怨这个?
T.J*_*der 51
问题是Integer.valueOf返回一个Integer,而不是一个int,但你someOtherMethod期望一个int.Findbugs基本上警告你,你正在做一个漫长的方式,涉及潜在地创建一个Integer你不需要的对象(你)然后通过传递它立即解除拆箱someOtherMethod(int),例如:
String => int => Integer => int
^^^^^^^^^^^^^^
\--- This is inside Integer.valueOf
相反,您可以并且可能应该避免不必要的往返,Integer并且只需:
String => int
^^^^^^^^^^^^^
\--- Integer.parseInt
没有必要进行临时Integer和潜在的内存分配以及周围的分配.
如果someOtherMethod期待一个Integer,你就不会得到警告,因为这Integer不是纯粹的临时性.
这只是Findbugs和它所帮助的工具指出的一类不必要的装箱转换之一.
mac*_*mac 14
我花了一段时间来计算出一个(部分是因为Jenkins只是说"装箱/拆箱来解析一个原语"),但显然问题/解决方案是在Integer.valueOf()内部做的,即:
Integer.valueOf(parseInt(s, 10));
Run Code Online (Sandbox Code Playgroud)
因此,解决方案是直接调用parseInt():
someOtherMethod(Integer.parseInt(id));
Run Code Online (Sandbox Code Playgroud)
可以在findbugs页面上找到问题的详细描述(DM_BOXED_PRIMITIVE_FOR_PARSING).