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