Java: si-retour-si-retour si vs-retour-elseif-retour
Demandé à un question sans rapport où j'ai eu un code comme ceci:
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
//Check property values
}
J'ai reçu un commentaire qui a affirmé que ce n'était pas la meilleure, et qu'à la place (si j'ai bien compris) doit faire ceci:
public boolean equals(Object obj)
{
if (this == obj)
return true;
else if (obj == null)
return false;
else if (getClass() != obj.getClass())
return false;
//Check property values
}
En raison de la reprise des déclarations, je ne vois pas vraiment pourquoi l'un d'eux devrait être plus efficace ou plus rapide que les autres. Compte tenu d'un certain objet, les deux méthodes ont à faire un nombre égal de vérifications d'aussi loin que je peux voir. Et parce que le retour des déclarations, pas de code supplémentaire irait dans l'un d'eux.
Suis-je manqué quelque chose? Est-il quelque chose à cela? Y at-il des optimisations du compilateur ou de quelque chose qui se passe ou quoi que ce soit?
Je sais que c'est micro-optimisation, et je vais probablement rester avec le premier de toute façon, puisque je pense que c'est plus propre avec toutes les fi sur la même position. Mais je ne peux pas l'aider; je suis curieux!
- Dites-moi le nom du mec qui a fait ce commentaire et je vais downvote lui 😉
- Je vous conseille de ne pas se préoccuper de ces micro-niveau des optimisations. Vous pouvez toujours trouver les puristes qui divisent les cheveux. Ces optimations sont bien pris en compte par le compilateur et les chances sont le premier reçoit déjà réduit à la deuxième version (ou vice-versa, selon ce que votre compilateur est bonne).
- Joshi - virtuelle (+1) au lieu d'élever votre main 🙂
- Jigar post était tout à fait stupide. Je sais que nous sommes censés pour être poli et tout, mais c mon. Pas étonnant que la qualité du travail dans le logiciel est à la traîne. C'est de la merde les gens doivent apprendre dans leur première introduction cours de programmation. Pour ne pas savoir qu'une autre personne est simplement du sucre syntaxique pour un autre si (ce qui n'est qu'un autre saut/goto sous le capot), qui n'est pas acceptable de quelqu'un qui a passé son introduction programmation des cours. Il y a beaucoup de choses dans la programmation/CS qui sont très compliquées. Ce n'est pas l'un d'eux.
- Ce que je pensais ceci Il était totalement en dehors de l'aspect, @Andreas_D @Swish Merci 🙂
- Juste pour clearify, ce n'était pas de bash en aucune manière de vous! Était juste vraiment curieux 🙂
- Tautologie la parole que deux fois la même chose en des termes différents, généralement considéré comme une faute de style
Vous devez vous connecter pour publier un commentaire.
Généré le byte-code est identique pour ces deux cas, c'est donc purement une affaire de style.
J'ai produit deux méthodes
e1
ete2
et à la fois la production de ce code octet (lecture à l'aide dejavap -v
):J'ai laissé de côté le code que j'ai mis après que de faire de la compilation.
else
déclaration en byte code, seulement un tas deif-condition-goto
ceux.ireturn
il n'a pas besoin de mettre unjump-to-the-end-of-the-if-else-cascade
déclaration. Et c'est assez trivial de vérifier.Ni l'un est plus efficace que l'autre. Le compilateur peut facilement voir que les deux sont identiques, et, en fait, des Soleils/Oracles
javac
produit identiques bytecode pour les deux méthodes.Voici un
IfTest
classe:J'ai compilé avec
javac
et le démontage est comme suit:Qui est, je vous conseille d'utiliser la première version (sans le
else
). Certains pourraient dire que c'est plus propre avec l'autre des parties, mais je dirais le contraire. Y compris laelse
indique que le programmeur ne savais pas que c'était inutile.Je ne vois aucune raison pratique pour remplacer l'une de ces mises en oeuvre avec l'autre dans n'importe quelle direction.
Le deuxième exemple serait logique si vous avez voulu éviter la présence de plusieurs instructions return dans une méthode, - certaines personnes préfèrent cette façon de coder. Puis nous avons besoin de l'if-else if constructions:
Pensez-y de cette façon. Lorsqu'une instruction return est exécutée, le contrôle des feuilles de la méthode, de sorte que le
else
n'a pas vraiment d'ajouter de la valeur, sauf si vous voulez faire valoir qu'elle ajoute de la lisibilité (à laquelle je ne pense pas vraiment qu'il n', mais d'autres peuvent être en désaccord).Ainsi, lorsque vous avez:
Il n'y a pas vraiment de valeur à l'ajout d'un
else
à la deuxièmeif
.En fait, j'utilise un outil lors de l'écriture de code C# appelé Resharper, et il sera en fait la marque de la
else
comme inutile le code dans ces situations. Donc je pense qu'en règle générale, il est préférable de les laisser. Et comme Joachim déjà mentionné, le compilateur optimise loin de toute façon.Je pense que ce code peut être un peu améliorée (vous l'esprit, c'est très lisible):
La
instanceof
opérateur est équivalent à ces deux combinés et est probablement plus rapide - moins de code, et pas des invocations de méthode:Mais que sais-je.... Je suis trop paresseux pour analyser le byte code (n'ayant jamais fait avant). :-p
getClass()
etinstanceof
sont pas équivalent. Si vous avez deux classesA
etB
oùB extends A
, puisgetClass()
est toujoursfalse
, alors queb instanceof A
esttrue
.