IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Test sur null ou equals sur une constante ?


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut Test sur null ou equals sur une constante ?
    Pour faire suite à cette discussion : http://www.developpez.net/forums/d13...s/#post7530394

    Il se trouve que j'ai pris l'habitude de tester mes chaînes ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "abcd".equals(maString)
    Naïvement je trouvais ça élégant, en plus de faire le boulot que je lui demande à savoir m'éviter une NullPointer et tester mon égalité.

    Apparemment cette écriture à des détracteurs, alors messieurs, à vos stylos.. enfin clavier quoi

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  2. #2
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Ça fait référence à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( "abcd".equals(value) ) {
    Versus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( value != null && value.equals("abcd") ) {
    Sachant qu'on aura sans doute soit :
    * "abcd" en constante ;
    * une valeur dynamique de comparaison.


    En constante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    final static public String ABCD = "abcd";
    ...
     
    if( value != null && value.equals(ABCD) ) {
    Ou en dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s = ...
     
    if( value != null && value.equals(s) ) {
    Notez que dans ce dernier cas, on n'est pas obligé de tester la nullité de "s".

    Il y a des différences :
    * sémantiquement ;
    * dans le plan d’exécution de la JVM (là je vais être un peu léger pour en discuter longtemps).
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Pour préciser mon propos, je n'utilise cette écriture que lorsque je dois comparer avec une constante soit une chaine constante "ABCD" soit une constante java déclarée ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final String ABCD = "ABCD";
    Sans aller jusqu'au plan d’exécution de la JVM et dans les use cases décrit juste au dessus, j'ai un peu de mal à voir la différence sémantique..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  4. #4
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Amha moins il y a de mots, mieux c'est (théorie de la complexité), donc ta solution est pour moi la meilleure.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par JoeChip Voir le message
    Amha moins il y a de mots, mieux c'est (théorie de la complexité), donc ta solution est pour moi la meilleure.
    Même si j'ai du mal avec leur déguisements, j'applique le principe du KISS dans mes développement: Keep It Simple and Stupid
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il est plus naturel (point de vue humain) de dire

    "Si la variable X vaut ABCD" que de dire "Si ABCD vaut la variable x". C'est juste de la sémantique. Ca ne vaut pas tripette comme argument


    Autre arguments, quand je dit

    x.equals("ABCD"), je refuse implicitment les cas où x égal à null comme des erreurs, et souvent on est face à une cas où une variable nulle n'a pas de sens et il est bon de lancer une erreur. Maintenant, ça vaut pas tripette non plus comme argument.

    Je trouve personellement "abcd".equals() plus robuste et court à lire.

  7. #7
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    "Si la variable X vaut ABCD" que de dire "Si ABCD vaut la variable x". C'est juste de la sémantique. Ca ne vaut pas tripette comme argument
    Ce n'est pas juste de la sémantique ! C'est de la SEMANTIQUE MOTHER FUCKER !

    Nan sans blague, c'est vraiment important.

    Je trouve personellement "abcd".equals() plus robuste et court à lire.
    Ça fait quoi au niveau de la JVM ça ? hein ? hein ?
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    La méthode equals étant une bijection, je ne vois pas bien en quoi a.equals(b) pourrait bien différer de b.equals(a) niveau sémantique.

    Ensuite pour ce que la JVM fait dans ce cas, elle initialise un objet String qu'elle place dans la Stack pour l'appel.. en gros ce qu'elle fait également lorsque la constante est en paramètre du equals.. en gros pour moi du kif kif.

    Après si on prend les sorties des 2 statements, on a du 100% identique. D'ailleurs cette écriture est régulièrement conseillée dans des documents de 'coding standard'

    Après si la FUCKING différence de sa mère la sémantique c'est de ne pas lire explicitement le test de null dans le programme.. ce n'est pas, à mon sens, de la sémantique mais de la syntaxe.

    La sémantique des deux écritures est:

    Compare les 2 strings et si jamais a est nulle retourne faux.
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  9. #9
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Sémantiquement c'est complètement équivalent, à la nuance près que le cas "s==null" est implicitement traité comme il le doit dans "abcd".equals(s)", càd comme tout autre cas où l'égalité n'est pas vérifiée. Et de toutes façons, pour écrire en plus de trois mots un truc "écrivable" en trois mots, faut des arguments puissants.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Il y a la sémantique de définition de l'algorithme Java, et il y a la sémantique d'expression de l'intention.
    Ce sont deux choses différentes.

    En termes d'algorithme, les deux notations n'ont pas de différence.
    Une légère différence théorique du temps d'exécution dans le fait que vérifier si un objet est null, est en théorie un peu plus rapide qu'invoquer une méthode. Avec les optimisations du JIT je n'y mettrais pas ma main à couper.

    En terme d'expression d'intention, l'une des notation indique explicitement qu'on vérifie si la non-constante est null. L'autre notation laisse cela à la déduction des programmeurs qui connaissent le truc, et montre une syntaxe bizarre aux autres, qui au premier refactoring vont inverser les deux objets, sans vérification de null, cette fois.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Non non non, ça a beau donner le même résultat, c'est très différent...

    Je vous donne un exemple qui sera plus parlant. Prenons un entier nb et comparons le à une valeur :


    est équivalent à

    Et ben non, pas du tout : le sens de lecture n'est pas le même dans les deux cas. Voici pourquoi j'oblige mon équipe à utiliser le second cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( 42 < nb && nb < 91) {
    Vous voyez l'intervalle dans l'exemple ?

    C'est pareil pour les strings.

    Quand je fais "abcd".equals(s) je compare "abcd" à s. Quand je fais s.equals("abcd") je compare s à "abcd"... Au final le résultat est le même mais le sens de lecture est différent.

    Pour la partie JVM, je vous laisse voir ça avec un spécialiste qui saura vous expliquer mieux que moi ce qui se passe, non pas en Java, mais dans la virtual machine.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par thierryler Voir le message
    Pour la partie JVM, je vous laisse voir ça avec un spécialiste qui saura vous expliquer mieux que moi ce qui se passe, non pas en Java, mais dans la virtual machine.
    Je suis suffisamment expert sur le sujet pour savoir que ce qui se passe ne démontre aucune différence notable. Deux ou trois instructions de plus ou de moins qui seront sans doute mises à niveau par le JIT, et qui de toute façon ne sont pas représentatives du temps d'exécution de l'ensemble.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    N'empêche que dans ce cas particulier, je trouve que c'est le mieux. Refactoriser ça aveuglément bah oui ça bugge comme toujours quand on refactorise aveuglément (et en l'occurrence sans gain)... Et considérer qu'il s'agit d'un "truc", c'est un drôle de point de vue. Pour les exemples plus compliqués, en revanche, je suis d'accord... Mais dans ce cas-ci c'est tellement limpide et simple que je ne vois pas ce qui justifierait une complexification des sources.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par JoeChip Voir le message
    N'empêche que dans ce cas particulier, je trouve que c'est le mieux. Refactoriser ça aveuglément bah oui ça bugge comme toujours quand on refactorise aveuglément (et en l'occurrence sans gain)... Et considérer qu'il s'agit d'un "truc", c'est un drôle de point de vue. Pour les exemples plus compliqués, en revanche, je suis d'accord... Mais dans ce cas-ci c'est tellement limpide et simple que je ne vois pas ce qui justifierait une complexification des sources.
    Laquelle est plus compliquée que l'autre est une question d'opinion, pas un fait. Une notation est explicite, l'autre non. Une notation est très courte, l'autre est assez longue et un peu lourdingue.
    Aucune de ces deux remarques n'est plus importante que l'autre par nature.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Perso j'ai tendance à utiliser la forme "x".equals(s) simplement pour simplifier la condition et éviter d'écrire une vérification supplémentaire vis à vis du null.

    A l'inverse si s ne devrait jamais être null, j'aurais tendance à utiliser directement s.equals("x") pour laisser remonter un NPE au plus tôt !


    Citation Envoyé par thierryler Voir le message
    Pour la partie JVM, je vous laisse voir ça avec un spécialiste qui saura vous expliquer mieux que moi ce qui se passe, non pas en Java, mais dans la virtual machine.
    Je serais curieux de connaitre ces différences... mais je doute que cela puisse avoir un impact quelconque.


    a++

  16. #16
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par thierryler Voir le message
    Je vous donne un exemple qui sera plus parlant. Prenons un entier nb et comparons le à une valeur :


    C'est surtout un poil biaisé comme exemple, equals est censé être une bijection alors que > non.

    a.equals(b) == b.equals(a)

    (a > b) != (b > a)

    Je n'ai parlé que du equals à dessein, je n'utilise pas ce raccourci pour les comparaisons.. ça me vrille les neurones pour tout remettre dans le bon sens et pour vérifier la logique
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par thierryler;7530816

    Et ben non, pas du tout : le sens de lecture n'est pas le même dans les deux cas. Voici pourquoi j'oblige mon équipe à utiliser le second cas :

    [code
    if( 42 < nb && nb < 91) {
    [/code]
    C'est dégueulasse. Tu leur a retiré la moitié des smiley possibles

    On ne peux plus faire le petit chat avec ses oreilles et sa moustache
    >3

    mais on peux toujours faire les coeurs
    <3

  18. #18
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    C'est a < b qu'il faut comparer à b > a !!!!

    Sinon, je préfère avoir des cœurs ;-)
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  19. #19
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par thelvin Voir le message
    En terme d'expression d'intention, l'une des notation indique explicitement qu'on vérifie si la non-constante est null. L'autre notation laisse cela à la déduction des programmeurs qui connaissent le truc, et montre une syntaxe bizarre aux autres, qui au premier refactoring vont inverser les deux objets, sans vérification de null, cette fois.
    L'autre écriture n'est pas plus safe, exemple rencontré récemment au taf.

    Expression originale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((str != null) && str.equals("ABCD"))
    On demande à un programmeur inexpérimenté (on va rester poli ) de rajouter un OR str.equals("BUSY").


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((str != null) && str.equals("ABCD") || str.equals("BUSY"))
    Bah là on a rien refactorisé..et on a un NullPointer des familles.

    On n'empêchera pas les âneries par une écriture .. mais là le mieux est l'ennemi du bien car:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ("ABCD".equals(str) || "BUSY".equals(str))
    Là pas de NPE
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  20. #20
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Effectivement, ce dernier argument me fait changer mon fusil d'épaule...
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/12/2008, 08h57
  2. Réponses: 1
    Dernier message: 28/03/2007, 19h20
  3. [VB.NET]Test sur changement de valeur d'une variable
    Par shinji_rem dans le forum Windows Forms
    Réponses: 9
    Dernier message: 29/11/2006, 15h53
  4. Parse error sur une constante
    Par Missie46 dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2006, 10h19
  5. [VBA-E]test sur le contenu de toute une ligne
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/02/2006, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo