使用Integer.valueOf(String)查找"使用解析基元进行装箱/取消装箱"的Findbugs

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).