Je pense que c'est naturel, mais il y a des moments où ce n'est pas protégé de façon inattendue. À titre d'exemple, prenons le traitement de booléen dans le branchement conditionnel.
~~ J'ai écrit "en Java" dans le titre, mais c'est probablement la même chose dans n'importe quelle langue. ~~ Annulez-le car il ne s'applique pas à d'autres langages tels que JavaScript [^ js].
Il y a des cas où cela est clairement nié par la norme de codage [^ 1], mais en Java, le code suivant ** ne doit pas être écrit **.
if (isAdmin == true) {
//Quand isAdmin est vrai
}
if (isAdmin == false) {
//Quand isAdmin est faux
}
J'écrirai trois raisons.
Le code ci-dessus peut être écrit comme suit: C'est plus simple.
if (isAdmin) {
//Quand isAdmin est vrai
}
if (!isAdmin) {
//Quand isAdmin est faux
}
Dans le cas de ʻif ~ else ~ `, il peut être simple d'écrire avec un opérateur ternaire. Cependant, l'abus de l'opérateur ternaire peut réduire la lisibilité. Veuillez vous référer à l'article suivant pour plus de détails.
String userType;
if (isAdmin) {
userType = "Administrateur";
} else {
userType = "Général";
}
//Il est plus simple d'écrire avec l'opérateur ternaire comme suit
String userType = isAdmin ? "Administrateur" : "Général";
Si c'est vrai, il n'y a pas de problème, mais s'il est faux, il y a des cas où «!» Est discret.
if (!obj.getFoo().isBar()) {
//En traitement
}
Dans de tels cas, il est judicieux d'ajouter des variables explicatives.
boolean bar = obj.getFoo().isBar();
if (!bar) {
//En traitement
}
En Java, il est décidé que l'instruction if doit être écrite comme un type booléen, donc l'écriture d'une affectation dans l'instruction if entraîne généralement une erreur de compilation. Cependant, dans le cas du type booléen, même si vous écrivez ce qui suit, la compilation passera sans avertissement.
if (isAdmin = true) {
//Quand isAdmin est vrai ... doit toujours être exécuté
}
if (isAdmin = false) {
//Quand isAdmin est faux ... il ne doit pas toujours être exécuté
}
//Cela entraînera une erreur de compilation
if (isAdmin = 1) {
}
Cependant, écrire en notation Yoda [^ yoda] comme indiqué ci-dessous est ** basculer **.
if (true == isAdmin) {
//Quand isAdmin est vrai
}
if (false == isAdmin) {
//Quand isAdmin est faux
}
En fait, il vous avertira avec IDE et FindBugs / SpotBugs [^ 3], donc vous ne devriez pas le remarquer, mais si vous n'écrivez pas ʻif (isAdmin == true) `depuis le début, il n'y a pas de problème.
Le contenu suivant est uniquement lorsque b == true
, et n'a aucun effet lorsque vous utilisez b == false
ou! B
. Voir les commentaires pour plus de détails.
C'est presque un aparté, mais en théorie ce serait inutile [^ 4]. Par exemple, compilez le code suivant et assemblez-le à l'envers avec javap -c
.
public class Main {
public int foo(boolean b) {
if (b == true) {
return 1;
} else {
return 0;
}
}
public int bar(boolean b) {
if (b) {
return 1;
} else {
return 0;
}
}
}
Ensuite, vous obtiendrez la sortie suivante (à l'exclusion de la sortie non pertinente):
public int foo(boolean);
Code:
0: iload_1
1: iconst_1
2: if_icmpne 7
5: iconst_1
6: ireturn
7: iconst_0
8: ireturn
public int bar(boolean);
Code:
0: iload_1
1: ifeq 6
4: iconst_1
5: ireturn
6: iconst_0
7: ireturn
Si vous lisez ceci, ce sera comme suit [^ 5]. Je l'ai écrit pendant longtemps, mais le fait est qu'une instruction est gaspillée.
C'est parce que ʻif (b) signifie" si b est vrai ", tandis que ʻif (b == vrai)
signifie "si b est vrai par rapport à vrai". Parce que c'est devenu.
b
) sur la piletrue
) sur la pile7:
sinon1
) sur la pile0
) sur la pileb
) sur la pile1
) sur la pile0
) sur la pileCertaines personnes peuvent dire: «Je m'en fiche», mais l'accumulation de ces petites choses fera une grande différence à l'avenir. Je veux que vous développiez peu à peu de bonnes habitudes.
Il semble qu'il y ait eu une réponse, je vais donc la compléter petit à petit.
flag
est mauvais → C'est vrai, j'ai donc ajouté une description.[^ 1]: [Java Coding Standards-Future Enterprise Coding Standards-Future Architect](https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3% 83% BC% E3% 83% 87% E3% 82% A3% E3% 83% B3% E3% 82% B0% E8% A6% 8F% E7% B4% 84.html) [^ 3]: [QBA: Méthode d'attribution d'une valeur littérale booléenne dans l'expression logique (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)](https://spotbugs.readthedocs.io/ja/latest/bugDescriptions.html#qba-boolean-qba-questionable -affectation-booléenne) [^ 4]: Je l'ai mesuré, mais je n'ai pas pu confirmer la différence. Donc "en théorie". [^ 5]: déduit de la Spécification de la machine virtuelle Java®. [^ yoda]: [Notation Yoda-Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%83%80%E8%A8%98%E6 % B3% 95) etc. [^ js]: Pour JavaScript: Opérateurs logiques --JavaScript | MDN
Recommended Posts