繁体   English   中英

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

[英]Findbugs issue with “Boxing/unboxing to parse a primitive” with Integer.valueOf(String)

我有这段代码:

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

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

在第二行,Findbugs抛出了这个异常:

用于解析基元的装箱/拆箱

当我只是调用Integer.valueOf()/我该如何解决这个问题时,为什么Findbugs抱怨这个?

问题是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和它所帮助的工具指出的一类不必要的装箱转换之一。

我花了一段时间来计算出一个(部分是因为Jenkins只是说“装箱/拆箱来解析一个原语”),但显然问题/解决方案是在Integer.valueOf()内部做的,即:

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

因此,解决方案是直接调用parseInt():

someOtherMethod(Integer.parseInt(id));

可以在findbugs页面上找到问题的详细描述(DM_BOXED_PRIMITIVE_FOR_PARSING)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM