web-dev-qa-db-fra.com

Problème de Findbugs avec "Boxing / unboxing pour analyser une primitive" avec Integer.valueOf (String)

J'ai ce morceau de code:

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

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

Et sur cette deuxième ligne, Findbugs lève cette exception:

Boxe/Unboxing pour analyser une primitive

Pourquoi Findbugs se plaint de cela quand j'appelle simplement Integer.valueOf ()/comment puis-je résoudre ce problème?

27
mac

Le problème est que Integer.valueOf renvoie un Integer, pas un int, mais votre someOtherMethod attend un int. Findbugs vous avertit essentiellement que vous le faites de manière longue et implique potentiellement la création d'un objet (le Integer) dont vous n'avez pas besoin et que vous allez ensuite immédiatement déballer en le passant à someOtherMethod(int), par exemple:

 String => int => Integer => int 
 ^^^^^^^^^^^^^^ 
\--- Ceci est dans Integer.valueOf 

Au lieu de cela, vous pouvez et devez probablement éviter cet aller-retour inutile à travers Integer et simplement faire:

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

Il n'y a tout simplement pas besoin du Integer temporaire et de l'allocation de mémoire potentielle et autres qui l'entourent.

Si someOtherMethod attendait un Integer, vous n'obtiendrez pas l'avertissement, car le Integer n'est pas purement temporaire.

Ce n'est là qu'une classe de conversions inutiles en boxe que Findbugs et des outils comme celui-ci soulignent utilement.

48
T.J. Crowder

Il m'a fallu un certain temps pour comprendre celui-ci (en partie parce que Jenkins vient de dire "Boxing/unboxing pour analyser une primitive"), mais apparemment, le problème/solution réside dans ce que fait Integer.valueOf () en interne, à savoir:

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

La solution est donc d'appeler simplement parseInt () directement à la place:

someOtherMethod(Integer.parseInt(id));

La description détaillée du problème (DM_BOXED_PRIMITIVE_FOR_PARSING) peut être trouvée sur la page findbugs .

13
mac