[Java] Attention aux courts-circuits (évaluation des courts-circuits)

Qu'est-ce qu'un court-circuit (évaluation de court-circuit)?

Avez-vous entendu parler d'un court-circuit (évaluation de court-circuit)?

[Opérateur logique] tel que "<< Côté gauche >> << Opérateur logique >> << Côté droit >>" (https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E6 % BC% 94% E7% AE% 97% E5% AD% 90) Supposons qu'il existe une expression (expression d'opérateur logique). L'évaluation de court-circuit consiste à évaluer le côté droit (deuxième argument) uniquement lorsque la valeur de l'expression entière n'est pas déterminée au stade de l'évaluation du côté gauche (premier argument). Évaluation de court-circuit-Wikipedia

L'opérateur de court-circuit de Java est||Quand&&Est applicable. Un opérateur logique qui signifie "et" ou "ou" utilisé lors de l'exécution d'opérations logiques. Expliquons en détail ce que cela signifie.

Exemple de code

La méthode isEmpty vérifie l'argument de type String et renvoie la valeur booléenne comme résultat de la vérification. La condition à vérifier est «soit un caractère nul, soit un caractère vide», mais l'opérateur logique qui signifie «ou» est l'opérateur de court-circuit.||est.

private static boolean isEmpty(String str) {
    if (str == null || str.isEmpty()) {
        return true;
    }
    return false;
}

Si l'argument str passé à isEmpty est nul, le résultat de l'évaluation du côté gauche str == null sera true. Étant donné que le résultat de l'évaluation sur le côté gauche est "true", le résultat de l'évaluation de l'instruction if ne change pas, que le résultat de l'évaluation du côté droit "str.isEmpty ()" soit "true" ou "false". Par conséquent, l'évaluation du côté droit est inutile et l'évaluation elle-même n'est pas exécutée. Le processus d'évaluation est ignoré. Si l'argument str n'est pas nul, par exemple, le côté droit doit être évalué et str.isEmpty () est exécuté.

Lorsque les résultats de l'évaluation des deux côtés sont confirmés par les résultats de l'évaluation du côté gauche, ** le court-circuit (évaluation du court-circuit) ** n'effectue pas d'évaluation inutile du côté droit.

Commentaire

||Pour les opérateurs, évalue si le côté gauche ou droit est vrai. Si le côté gauche est vrai, le côté droit n'est pas évalué car le résultat de l'évaluation ne peut pas être autre chose que vrai selon le côté droit. Si le côté gauche est faux, le résultat de l'évaluation est vrai si le côté droit est vrai, et s'il est faux, le résultat de l'évaluation est faux, donc le côté droit doit également être évalué.

L'opérateur && évalue si les côtés gauche et droit sont vrais. Si le côté gauche est faux, le côté droit n'est pas évalué car le résultat de l'évaluation ne peut pas être autre chose que faux selon le côté droit. Si le côté gauche est vrai, le résultat de l'évaluation est vrai si le côté droit est vrai, et s'il est faux, le résultat de l'évaluation est faux, donc le côté droit doit également être évalué.

L'opérateur logique calcule le résultat de l'évaluation en combinant les évaluations du côté droit et du côté gauche. Cependant, en utilisant l'opérateur de court-circuit, il est possible d'en évaluer un seul, c'est-à-dire de simplifier le traitement lors de l'exécution.

Pièges de court-circuit

Si l'argument str passé à isEmpty dans l'exemple de code est nul, le côté droit str.isEmpty () ne sera pas exécuté. Autrement dit, une NullPointerException ne se produit pas lors de l'évaluation de l'instruction if.

Mais que faire si vous échangez les côtés gauche et droit?

private static boolean isEmpty(String str) {
    if (str.isEmpty() || str == null) {
        return true;
    }
    return false;
}

Une NullPointerException se produit lorsque le côté gauche str.isEmpty () est évalué. Lors du codage, il peut être nécessaire de prendre en compte l'ordre d'évaluation du côté gauche et du côté droit de cette manière.

Opérateur logique||Quand&&がショートサーキットである意識がない場合、左辺の評価によって右辺の評価自体が行われないこQuandも意識できません。 Opérateurs logiques Java||Quand&&はショートサーキットであるこQuandを意識してのコーディングが必要です。

Supplément: à propos de l'opérateur d'évaluation complet

Fondamentalement en tant qu'opérateur logique en Java||Quand&&を使用するQuand思いますが、ショートサーキットではない、左辺Quand右辺を必ず評価する論理演算子も存在します。|Quand&est. C'est ce qu'on appelle l'opérateur d'évaluation complète. Elle est également appelée évaluation booléenne complète ou évaluation logique complète. J'écris Java depuis quelques années, mais je ne l'ai jamais utilisé. C'est toujours une prémisse de court-circuit.

Cependant, cela est limité aux langues qui ont des opérateurs de court-circuit, et inversement, certaines langues n'ont pas d'opérateurs de court-circuit. C'est vrai pour VBA. Évaluez toujours les deux côtés.

Voici un exemple d'implémentation de la méthode isEmpty dans VBA sans l'opérateur de court-circuit, mais vous devez approfondir l'imbrication pour éviter les exceptions. Dans un tel langage, si vous ne revenez pas avec un retour anticipé comme dans l'exemple ci-dessous et faites attention à ne pas sortir de la méthode, l'imbrication deviendra plus profonde et la lisibilité diminuera ... À propos, dans VBA, il n'y a pas de valeur NULL dans le type de chaîne de chaîne (Len (vbNullString) result est 0,vbNullString = ""result est True, Null et ʻEmpty` sont pour le type Variant uniquement. ), Type de collection.

Function IsEmpty(ByVal list As Collection) As Boolean
    IsEmpty = True
    If list Is Nothing Then
        ' null(Etat)dans le cas de
        Exit Function
    End If
    If list.Count = 0 Then
        'Lorsque le nombre d'éléments est égal à 0
        Exit Function
    End If
    IsEmpty = False
End Function

Recommended Posts

[Java] Attention aux courts-circuits (évaluation des courts-circuits)
Points à prendre en compte lors de l'écriture de Java
Le servlet Java doit être conscient de l'environnement multithread
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz
[Java Silver] Ce qu'il faut savoir concernant les instructions switch
Éléments à prendre en compte lors de l'écriture de code en Java
Être conscient du code facile à lire
5 choses dont les nouveaux programmeurs devraient être conscients
[Débutant] Points à surveiller après les exercices Java / Héritage / Méthode abstraite [Note 26]
[Java] Présentation de Java
[Rails] Lorsque vous utilisez ajax, faites attention aux "mesures CSRF".
Soyez conscient du garbage collection et évitez les fuites de mémoire
[Java10] Veillez à utiliser ensemble var et génériques