Est la concaténation avec une chaîne vide pour faire une chaîne de conversion vraiment si mauvais?
Disons que j'ai deux char
variables, et plus tard je veux concaténer une chaîne de caractères. C'est comment j'allais le faire:
char c1, c2;
//...
String s = "" + c1 + c2;
J'ai vu des gens qui disent que la "" +
"truc" est "moche", etc, et que vous devez utiliser String.valueOf
ou Character.toString
à la place. Je préfère cette construction parce que:
- Je préfère l'utilisation d'une langue plutôt la fonction d'appel d'API si possible
- En général, n'est pas la langue généralement plus stable que l'API?
- Si le langage ne cache appel d'API, puis encore plus forte raison de le préférer!
- Plus abstrait! Le masquage est bon!
- J'aime que la
c1
etc2
sont visuellement sur le même niveauString.valueOf(c1) + c2
suggère quelque chose de spécial à propos dec1
- C'est plus court.
Est-il vraiment un bon argument pourquoi String.valueOf
ou Character.toString
est préférable de "" +
?
Anecdote: dans java.lang.AssertionError
, la ligne suivante apparaît 7 fois, chacun avec un type différent:
this("" + detailMessage);
- Bien sûr
String.valueOf(c1) + c2
serait bizarre, si vous allez dans cette voie, vous devez écrireString.valueOf(c1) + String.valueOf(c2)
- vous pouvez écrire
new String(new char[] {c1, c2})
- ad Trivia: le Java SE bibliothèques de base ne sont pas exactement une fontaine de bon style d'écriture, c'est bien connu 😉
- Sauer ouais c'est une autre façon de faire. Je voulais juste faire remarquer qu'il est un peu absurde de convertir un mais pas l'autre. Il serait, comme l'OP dit à juste titre, à tort suggérer que quelque chose de spécial qui se passe.
- Regardez ici pour une question connexe: stackoverflow.com/questions/1572708/...
Vous devez vous connecter pour publier un commentaire.
Vos arguments sont bons; c'est l'un des plus expressifs les zones du langage Java, et le
"" +
idiome semble bien ancrée, comme vous l'avez découvert.Voir La concaténation de chaîne dans le JLS. Une expression comme
est équivalent à
sauf que tous les objets intermédiaires ne sont pas nécessaires (donc l'efficacité n'est pas un motif). La spec dit qu'une application peut utiliser la
StringBuffer
ou pas. Depuis cette fonctionnalité est intégrée à la langue, je ne vois pas de raison d'utiliser le plus prolixe forme, surtout dans un marché déjà détaillé de la langue.Le problème avec cette construction est qu'elle n'a généralement pas d'exprimer l'intention.
Il représente la concaténation d'une Chaîne par une autre valeur, mais la concaténation n'est généralement pas le but de cette ligne.
Dans le cas particulier qui vous l'a démontré, la concaténation est en fait l'objectif, de sorte que ce code ne exprimer l'intention.
Dans l'utilisation plus fréquente de cette approche (
String s = "" + intValue;
), la concaténation est simplement toléré côté-effet, tandis que la conversion deintValue
est l'objectif réel. Et un simpleString.valueOf(intValue)
exprime l'intention beaucoup plus claire."" + x
est extrêmement commun, l'intention doit être claire.Je préfère utiliser
String.valueOf
pour unique conversions - mais dans votre cas, vous voulez vraiment la concaténation.Cependant, je dirais que cette version serait de supprimer toute ambiguïté potentielle:
De cette façon, il n'y a aucune possibilité, même à distance, de quelqu'un qui envisage de savoir si c1 et c2 sont ajoutés avant la concaténation.
À mon avis,
"" + x
est très lisible, court et précis pour le moment. Je préfère ça à plus construit commeString.valueOf
. Le comportement est bien défini et il est donc communément en usage que j'ai du mal à appeler cela un hack à tous.La seule chose que je serais un peu inquiet au sujet de la performance et je suis très positif qu'il n'est pas question d'habitude (même si je n'ai pas de mesurer ou de regarder le binaire). Il ya aussi une bonne chance que ce genre de concat est optimisée, car il devrait être facile de le détecter (c'est juste une supposition bien).
Je pense que dans
"" + var
la+
est effectivement surchargé pour faire la conversion:Donc pas de différence et pas de problème à partir d'un point de vue technique.
Forme d'une lisibilité point de vue - c'est une question de préférence personnelle ou convenu style de codage au sein de l'équipe.
Ce sujet
et si vous le faites beaucoup vous pouvez créer une classe "Cordes" avec:
Votre ligne serait alors lire
Belle et courte.
Édité
Un meilleur nom peut être:
String s = CharHelper.charsToString(a, b)
À moins que votre application a besoin chaque once de performance, d'écrire le code qui est plus rapide à écrire et plus facile à lire. "" + est plus lente à exécuter la syntaxe, mais il semble certainement plus facile à lire à chaque fois que je l'ai utilisé.
La
"" + var
style a un très gros problème à mon avis. Il utilise juste la méthode toString de lavar
. Donc, si vous changez le type de var à autre chose, vous n'obtiendrez pas une exception. Un bel exemple, j'ai juste rencontré, c'est que le type a été modifié à partir deint
àOptional<Integer>
. Le code compile bien, mais vous obtenez un résultat complètement différent.La meilleure façon de le savoir est de compiler /décompiler votre code, j'ai utilisé Jad http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler) pour cela, vous verrez que votre expression a été converti en
String s = (new StringBuilder()).append("").append(ci).append(c2).toString();
Comme vous pouvez le voir javac inclus append (""), mais son coût est négligeable, en notant est ajouté à l'interne StringBuilder de la mémoire tampon, vous pouvez vérifier StringBuilder source