Java Chaîne d'initialisation
Lequel préférez-vous et pourquoi"
String myString = null;
if(someCondition)
myString = "something";
else
myString = "something else";
OU
String myString = "";
if(someCondition)
myString = "something";
else
myString = "something else";
Je sais que l'utilisation du ternaire (? 🙂 opérateur est possible mais j'aimerais savoir les deux ci-dessus.
Notez que la déclaration "String machaine;" en Java entraîne implicitement initialisé à null.
Seulement, par exemple) et des variables statiques. Pas pour les variables locales, ils doivent être définitivement attribuées avant de pouvoir les lire.
Pour le suivi de Jon commentaire, Java n'ont pas laissé de fonctionnement sur la variable si elle n'a pas été initialisée, vous obtenez "variable foo n'aurait pas été initialisé"
celle-ci devrait générer un
Merci pour la clarification.
Seulement, par exemple) et des variables statiques. Pas pour les variables locales, ils doivent être définitivement attribuées avant de pouvoir les lire.
Pour le suivi de Jon commentaire, Java n'ont pas laissé de fonctionnement sur la variable si elle n'a pas été initialisée, vous obtenez "variable foo n'aurait pas été initialisé"
celle-ci devrait générer un
Dead store to myString
avertissement dans FindBugs, j'espèreMerci pour la clarification.
OriginalL'auteur ewa | 2010-07-23
Vous devez vous connecter pour publier un commentaire.
Ni. Au lieu de cela, ce:
Dans les deux de vos solutions de rechange, la variable est initialisée avec une valeur qui ne sera jamais lu. Le fait qu'il est présent à tous est trompeuse.
Je fait utiliser l'opérateur conditionnel, bien sûr - mais sauf que, le ci-dessus est la meilleure option.
+1 pour l'opérateur conditionnel, il brille dans ce genre de situations
Ce n'est pas simplement un style de préférence pour celui-ci, c'est vraiment une meilleure solution. Le compilateur a la capacité de chemin de vérifier ici et vous dire si l'un des chemins ne parvient pas à initialiser la valeur avant qu'il est utilisé. Dans le cas où vous l'initialiser, vous supprimez les compilateurs capacité à vous aider avec ça.
Non, voir les commentaires sur la question.
OriginalL'auteur Jon Skeet
La idiomatiques façon est d'utiliser ternaire/opérateur conditionnel (JLS 15.25):
Mais vous pouvez aussi faire le plus de commentaires
if-else
déclaration si vous vous sentez vraiment que vous devez:Notez que j'ai ajouté
final
modificateur dans l'extrait ci-dessus. Si vous avez l'intention sur la poursuite de la réorganisation de la variable, puis, bien sûr, il ne peut pas êtrefinal
, de sorte que vous pouvez supprimer le modificateur et bien sûr, le code fonctionne encore.Pourquoi
final
?Le point de la
final
dans l'extrait ci-dessus est de montrer que laif-else
construire à attribuer auxmyString
une fois et une seule fois dans tous les chemins d'exécution possibles. C'est l'idée principale du projet deif-else
solution: si vous allez à affecter une valeur à une variable locale une seule fois, même si il peut y avoir plusieurs possibilités, puis le fairefinal
pour améliorer la lisibilité.Contraste avec cette "alternative" proposition par exemple:
Avec cette construction, vous pouvez attribuer à
myString
deux fois, donc on ne pouvait pas mettrefinal
ici, même si il n'y avait plus d'une réaffectation. Vous aussi ne pouvait pas mettrefinal
en soit de l'origine= null;
ou= "";
propositions, et c'est l'une des principales raisons pour lesquelles ils ne sont pas recommandable.Il n'y a pas de point dans l'affectation d'une valeur à une variable si vous êtes juste de le remplacer avant que vous allez utiliser. Ça fait mal de lisibilité, et pourrait même cacher des bugs, par exemple, lorsqu'un chemin d'exécution ne parvient pas à remplacer cette "première" de la valeur.
Références
final
VariablesSommaire
final
pour améliorer la lisibilitéfinal
immédiatement assure ses lecteurs que pas d'autres mutations sont possiblesGrande réponse maintenant, +1.
Downvoter veuillez expliquer parce que je révise mes réponses sur la base des commentaires.
OriginalL'auteur polygenelubricants
L'étape d'initialisation n'est pas nécessaire, et peut le confondre les futurs lecteurs.
Mon opinion personnelle est que ce genre de variable ne doit être attribué une fois, donc c'est un candidat parfait pour le
final
mot-clé.Noter que le myString définition n'inclut pas une cession (comme ce serait d'interdire à plus tard exercices) et que, après la cession, il est en lecture seule. Cela donne robuste code et montre votre intention plus clairement.
Veuillez également noter que, je crois, dans des accolades, même pour une seule ligne. Probablement un Perl habitude, mais si vous ne le faites pas, il va vous mordre un jour.
OriginalL'auteur Thorbjørn Ravn Andersen
OriginalL'auteur MCain
Je préfère la première, parce que
String myString = ""
permettra de créer d'autres objets dans la piscineoui, mais ce interné chaîne doivent être créés dans la chaîne de la piscine
Une fois... à un coût notable, ce qui serait presque certainement se produire de toute façon parce que la plupart des programmes Java va toucher une bibliothèque quelque part qui a une chaîne vide.
OriginalL'auteur rachvela
Ci-dessus sera la cause de l'erreur due à l'pointeur null.
J'aime utiliser plus tard, mais je pense que c'est question de préférence personnelle.
C'est vrai, mais totalement hors de propos; il n'est pas l'appel d'une fonction sur le pointeur null, il est réaffectation immédiatement
OriginalL'auteur Anatoli
Comment à ce sujet follwing code ,de toute façon il veut quelque chose.
ou ce
dans le cas ci-dessus , si vous êtes sûr à 90% que someCondition est toujours vrai. sinon, inutile de création de l'objet dans la déclaration.Attend les commentaires de Gourous.
OriginalL'auteur Dead Programmer