Il y a des avantages pour chacun et je comprends les différences, mais qu'est-ce qui est considéré comme la meilleure pratique / la pratique standard? Et pourquoi?
Par exemple :
"myString".equals(myStringVar)
- Évite un NPE potentiel et ne nécessite pas de vérification nulle. (Bonne chose?)
- Nettoyant à lire car une vérification nulle n'est pas requise.
- Si null n'est pas une valeur attendue, votre programme pourrait se casser sans être le plus sage.
pourtant
myStringVar.equals("myString")
- Nécessite une vérification nulle si null est une valeur attendue. (Bonne chose?)
- Peut encombrer les conditionnels composés avec des contrôles nuls.
- Permet à NPE de nous faire savoir si quelque chose s'est cassé.
Quelle variante est considérée comme la norme à utiliser pour Java, et pourquoi?
Réponses:
Je soupçonne que cela provient d'une précaution de sécurité utilisée lors de la programmation en C plus ancien (ou C ++). En C, vous pouvez accidentellement affecter une valeur lorsque vous souhaitez tester l'égalité:
Cette condition sera toujours vraie, car sa valeur xa d'affectation est de 3, et ne teste pas que x est égal à 3. Pour éviter ces bogues subtils, les développeurs ont commencé à inverser la condition:
Cela contient le même "bug", mais générera une erreur de compilation, donc c'est plus sûr.
Les langues plus modernes n'ont pas ce problème, et elles peuvent facilement vous avertir lorsque vous essayez de faire ce genre de choses. En tant que tel, ce n'est pas une préférence à peu près pure, alors choisissez-en une et utilisez-la de manière cohérente.
la source
equals
. Contrairement à C, le problème pour Java est que l'expressionx.equals(y)
lancera un NPE lorsqu'ilx
est nul. Si vous avez un littéral String"something"
et que vous souhaitez considérer le casnull
comme "différent de", il est logique d'écrire"something".equals(y)
si vous ne savez pas s'ily
peut être nul. Cela ne lancera jamais de NPE.La norme et les bonnes pratiques varient selon la culture d'une organisation pour laquelle vous travaillez
Notre norme en .NET est
myStringVar == "myString"
simplement parce que nous nous y sommes mis d'accord, c'est-à-dire que nous pensons qu'il est propre et concsiceRemarque: Cela ne s'applique pas à Java en raison de la
==
comparaison des références au lieu des objets eux-mêmes. En Java, vous devriez utilisermyStringVar.equals("myString")
.la source
==
car il compare uniquement les références d'objets. Cela dit, +1 pour le setiment - convention définit souvent la "bonne" façon de faire les choses.myStringVar == "myString"
c'est une très mauvaise idée sur Java (à moins que vous ne soyez absolument certain d'myStringVar
être interné).Je pense que vous avez raison en ce que cela dépend de la sémantique de nullité de la variable. Si vous ne vous attendez pas à ce qu'il soit nul et que vous n'ayez pas à le vérifier et à le gérer, le premier formulaire est plus propre.
Cela dit, plutôt que d'intégrer le littéral de chaîne, une meilleure option serait probablement la suivante:
Surtout s'il existe un potentiel d'utilisation de la chaîne à plusieurs endroits.
la source