web-dev-qa-db-fra.com

L'appel facultatif # isPresent () sur une seule ligne est signalé comme n'étant pas appelé

J'exécute SonarQube pour vérifier mon code et j'ai trouvé un cas pour lequel je ne comprends pas l'erreur rapportée.

Mon code est:

private static final int BASE_ID = 100_000_000;
private boolean isValidId(Id id) {
    return id.asInteger().isPresent() && id.asInteger().get() >= BASE_ID;
}

La méthode asInteger renvoie Optional<Integer>

L'erreur que j'obtiens de sonarqube est Call "Optional#isPresent()" before accessing the value. Dans la ligne de retour.

Je comprends que le code est correct car la deuxième partie de if want est exécutée si la première est fausse. Je sais que cela peut être résolu avec une .filter(..).isPresent() mais je l’aime plus de cette façon.

Des idées pourquoi cela arriverait-il?

9

Sonarqube ne peut pas garantir que les deux appels à id.asInteger() renvoient le même objet, par exemple. parce que le multi-threading a peut-être changé la valeur de id entre les deux appels, il est donc correctement indiqué que la présence n'a pas été testée de manière adéquate.

Modifiez le code à affecter en premier à une variable locale, pour vous assurer que isPresent() et get() sont appelés sur le même objet:

private boolean isValidId(Id id) {
    Optional<Integer> idAsInteger = id.asInteger();
    return idAsInteger.isPresent() && idAsInteger.get() >= BASE_ID;
}
12
Andreas

Vous pouvez écrire cela en une seule déclaration:

return id.asInteger()
         .map(x -> x >= BASE_ID)
         .orElse(false)

mais le sonar se plaint parce qu’il s’agit d’un faux positif dans ce cas. 

3
Eugene

Lorsque vous travaillez avec Optionals, évitez autant que possible .isPresent et .get. L'utilisation de ces méthodes n'est pas plus sûre que l'utilisation de valeurs nulles et va à l'encontre de l'esprit fonctionnel. Les options sont conçues pour la programmation fonctionnelle et pour une variante typeafe des contrôles nuls.

SonarQube n’a que des capacités limitées avec son analyse. Il ne peut généralement pas exclure toutes sortes de faux positifs. Ce cas n'est pas vraiment un problème car il n'est pas recommandé d'utiliser Optionals de cette façon. 

0
Donat