Je comprends que chaque fois que je tape le littéral de chaîne ""
, le même objet String est référencé dans le pool de chaînes.
Mais pourquoi l'API String n'inclut-elle pas un public static final String Empty = "";
, donc je pourrais utiliser des références à String.Empty
?
Cela permettrait d'économiser sur le temps de compilation, à tout le moins, car le compilateur saurait référencer la chaîne existante, et n'aurait pas à vérifier si elle avait déjà été créée pour être réutilisée, non? Et personnellement, je pense qu'une prolifération de littéraux de chaîne, en particulier de minuscules, dans de nombreux cas est une "odeur de code".
Y avait-il donc une raison de Grand Design derrière aucun String.Empty, ou les créateurs de langage n'ont-ils tout simplement pas partagé mes vues?
outputBlah = ""
, et il préfère probablementsomething == String.Empty
plussomething.Length > 0
aussi bien (vous sautez un chèque nul.)String.isEmpty()
fonction ... pourquoi voudriez-vousString.EMPTY
?String.isEmpty()
ne renvoie pas de chaîne vide.Réponses:
String.EMPTY
est de 12 caractères et de""
deux, et ils feraient tous deux référence exactement à la même instance en mémoire lors de l'exécution. Je ne sais pas vraiment pourquoiString.EMPTY
gagnerait du temps de compilation, en fait je pense que ce serait ce dernier.Particulièrement compte tenu du fait que les
String
s sont immuables, ce n'est pas comme si vous pouviez d'abord obtenir une chaîne vide et effectuer certaines opérations dessus - il vaut mieux utiliser unStringBuilder
(ouStringBuffer
si vous voulez être thread-safe) et le transformer en une chaîne.Mise à jour
De votre commentaire à la question:
Je pense qu'il serait tout à fait légitime de fournir une constante dans votre classe appropriée:
Et puis référencez-le comme dans votre code
De cette façon, au moins, vous êtes explicite que vous voulez une chaîne vide, plutôt que vous avez oublié de remplir la chaîne dans votre IDE ou quelque chose de similaire.
la source
StringBuilder
sans parler du fait que neuf fois sur dix, il est totalement inapproprié d'utiliserStringBuilder
plutôt que de concaténer.Utilisation
org.apache.commons.lang.StringUtils.EMPTY
la source
""
... et la plupart s'opposeraient probablement fortement à l'utilisation de,EMPTY
sauf dans des situations spécifiques oùEMPTY
a une signification spécifique au domaine. (Et dans de tels cas, il y a probablement un nom plus approprié.)Si vous souhaitez comparer avec une chaîne vide sans vous soucier des valeurs nulles, vous pouvez procéder comme suit.
En fin de compte, vous devez faire ce que vous pensez être le plus clair. La plupart des programmeurs supposent que "" signifie une chaîne vide, pas une chaîne dans laquelle quelqu'un a oublié de mettre quoi que ce soit.
Si vous pensez qu'il existe un avantage en termes de performances, vous devez le tester. Si vous ne pensez pas que cela vaut la peine d'être testé par vous-même, c'est une bonne indication que cela n'en vaut vraiment pas la peine.
Il vous semble que vous essayez de résoudre un problème qui a été résolu lorsque le langage a été conçu il y a plus de 15 ans.
la source
if ("" == text)
if ("" == new String())
c'est faux. Un meilleur testif(text.isEmpty())
Si vous voulez vraiment une constante String.EMPTY, vous pouvez créer une classe finale statique utilitaire nommée "Constantes" (par exemple) dans votre projet. Cette classe conservera vos constantes, y compris la chaîne vide ...
Dans la même idée, vous pouvez créer des constantes ZERO, ONE int ... qui n'existent pas dans la classe Integer, mais comme je l'ai commenté, ce serait pénible d'écrire et de lire:
Etc.
la source
Apache StringUtils résout également ce problème.
Échecs des autres options:
Granted StringUtils est une autre bibliothèque à déplacer, mais elle fonctionne très bien et économise beaucoup de temps et de tracas pour vérifier les valeurs nulles ou gérer les NPE avec élégance.
la source
"".equals(s)
?Ne vous contentez pas de dire que "le pool de mémoire des chaînes est réutilisé sous la forme littérale, cas fermé". Ce que les compilateurs font sous le capot n'est pas le sujet ici. La question est raisonnable, surtout compte tenu du nombre de votes positifs qu'elle a reçus.
Il s'agit de la symétrie , sans elle, les API sont plus difficiles à utiliser pour les humains. Les premiers SDK Java ignoraient notoirement la règle et maintenant c'est un peu trop tard. Voici quelques exemples au-dessus de ma tête, n'hésitez pas à intégrer votre exemple "préféré":
la source
Tous ceux
""
littéraux sont le même objet. Pourquoi rendre toute cette complexité supplémentaire? C'est juste plus long à taper et moins clair (le coût pour le compilateur est minime). Étant donné que les chaînes de Java sont des objets immuables, il n'est jamais nécessaire de les distinguer, sauf peut-être pour des raisons d'efficacité, mais avec le littéral de chaîne vide, ce n'est pas un gros problème.Si vous voulez vraiment une
EmptyString
constante, faites-la vous-même. Mais il ne fera qu'encourager un code encore plus verbeux; il n'y aura jamais aucun avantage à le faire.la source
x = String.Empty
transmet l'intention mieux quex = ""
. Ce dernier pourrait être une omission accidentelle. Dire qu'il n'y a jamais aucun avantage est incorrect.x = String.Empty
transmet l'intention, vrai. Mais supposons que le langage fournisse une constanteString.Empty
, lorsque vous rencontrez,x = ""
vous en savez toujours autant sur l'intention que s'il n'y avait pas une telle constante. Vous auriez besoin de garantir que tous les endroits du code Java du monde où une chaîne vide était intentionnelle n'utilisent pas""
afin d'obtenir le gain d'informations que vous mentionnez. Ironiquement, C # utilise une constante et encourage son utilisation, donc comme je l'ai dit, je sais que c'est une discussion très d'opinion.""
doit être illégal, pour exclure les accidents. Je blague!Pour ajouter à ce que Noel M a déclaré, vous pouvez regarder cette question, et cette réponse montre que la constante est réutilisée.
http://forums.java.net/jive/message.jspa?messageID=17122
la source
Je comprends que chaque fois que je tape le littéral String "", le même objet String est référencé dans le pool String.
Il n'y a pas une telle garantie. Et vous ne pouvez pas vous y fier dans votre application, c'est à jvm de décider.
ou les créateurs de la langue n'ont-ils tout simplement pas partagé mes opinions?
Oui. Pour moi, cela semble chose de très faible priorité.
la source
String username = "Bob" + " " + "Smith";
). Les chaînes créées par programmation n'ont aucune garantie d'être internées, sauf si vous appelez explicitementintern()
comme vous l'avez indiqué. Le scénario de l'OP décrit l'utilisation du littéral de chaîne vide""
dans tout le code, ce qui est un cas où l'internement automatique se produirait.String a = ""; for(int i = 0; i < 100; i++) {a += "a";} String b = ""; for(int i = 0; i < 100; i++) {b += "b";} a.intern(); b.intern();
Maintenant, lea
etb
pointez sur le même emplacement de mémoire dans PermGen. Voir cet articleRéponse tardive, mais je pense que cela ajoute quelque chose de nouveau à ce sujet.
Aucune des réponses précédentes n'a répondu à la question d'origine. Certains ont tenté de justifier l'absence de constante, tandis que d'autres ont montré comment nous pouvons faire face à l'absence de constante. Mais personne n'a fourni de justification convaincante au bénéfice de la constante, de sorte que son manque n'est toujours pas correctement expliqué.
Une constante serait utile car elle éviterait que certaines erreurs de code ne passent inaperçues.
Supposons que vous ayez une grande base de code avec des centaines de références à "". Quelqu'un en modifie un en faisant défiler le code et le change en "". Un tel changement aurait de fortes chances de passer inaperçu en production, auquel cas il pourrait provoquer un problème dont la source sera difficile à détecter.
OTOH, une constante de bibliothèque nommée EMPTY, si elle est sujette à la même erreur, générerait une erreur de compilation pour quelque chose comme EM PTY.
Définir sa propre constante est encore mieux. Quelqu'un pourrait encore modifier son initialisation par erreur, mais en raison de sa large utilisation, l'impact d'une telle erreur serait beaucoup plus difficile à passer inaperçu qu'une erreur dans un cas d'utilisation unique.
C'est l'un des avantages généraux que vous obtenez en utilisant des constantes au lieu de valeurs littérales. Les gens reconnaissent généralement que l'utilisation d'une constante pour une valeur utilisée dans des dizaines d'endroits vous permet de mettre facilement à jour cette valeur en un seul endroit. Ce qui est moins souvent reconnu, c'est que cela empêche également que cette valeur ne soit accidentellement modifiée, car un tel changement apparaîtrait partout. Donc, oui, "" est plus court que VIDE, mais VIDE est plus sûr à utiliser que "".
Donc, pour revenir à la question d'origine, nous ne pouvons que spéculer que les concepteurs de langage n'étaient probablement pas conscients de cet avantage de fournir des constantes pour les valeurs littérales qui sont fréquemment utilisées. Espérons que nous verrons un jour des constantes de chaînes ajoutées en Java.
la source
Pour ceux qui prétendent
""
etString.Empty
sont interchangeables ou c'est""
mieux, vous avez très tort.Chaque fois que vous faites quelque chose comme myVariable = ""; vous créez une instance d'un objet. Si l'objet String de Java avait une constante publique EMPTY, il n'y aurait qu'une seule instance de l'objet ""
Par exemple: -
10 (11 y compris String.EMPTY) Pointeurs vers 1 objet
Ou: -
10 pointeurs vers 10 objets
Ceci est inefficace et tout au long d'une grande application, peut être significatif.
Le compilateur Java ou l 'exécution est peut - être suffisamment efficace pour pointer automatiquement toutes les instances de "" vers la même instance, mais il se peut qu'il ne le fasse pas et nécessite un traitement supplémentaire pour effectuer cette détermination.
la source
if (text == "")