298 votes

Pourquoi n’y a-t-il pas String.Empty dans java ?

Je comprends que chaque fois que je tapez la Chaîne de caractères littérale "", sur la même Chaîne de l'objet est référencé dans la Chaîne de la piscine.

Mais pourquoi ne pas la Chaîne API inclure un public static final String Empty = "";, afin que je puisse utiliser des références à String.Empty?

Cela permettrait d'économiser sur le temps de compilation, à tout le moins, puisque le compilateur serait de savoir de référence de la Chaîne existante, et ne pas avoir à vérifier si elle a déjà été créé pour la réutilisation, à droite? Et personnellement, je pense à une prolifération de littéraux de Chaîne, en particulier les petits, dans de nombreux cas, est une "odeur de code".

Donc, il y a un Grand dessein Raison derrière aucune Chaîne.Vide, ou la langue créateurs simplement de ne pas partager mon point de vue?

208voto

Noel M Points 6263

String.EMPTY est de 12 caractères, et "" est deux, et ils seraient tous les deux référencement exactement la même instance en mémoire lors de l'exécution. Je ne suis pas entièrement sûr de savoir pourquoi String.EMPTY permettrait d'économiser sur le temps de compilation, en fait, je crois que ce serait la dernière.

Surtout en considérant Strings sont immuables, ce n'est pas comme vous pouvez d'abord obtenir une Chaîne vide, et d'effectuer certaines opérations sur elle - mieux utiliser l' StringBuilder (ou StringBuffer si vous voulez être thread-safe) et de le transformer en une Chaîne de caractères.

Mise à jour
De votre commentaire à la question suivante:

Ce qui a inspiré ce est en fait TextBox.setText("");

Je crois qu'il serait tout à fait légitime de fournir une constante dans votre classe:

private static final String EMPTY_STRING = "";

Et puis le référencer comme dans votre code

TextBox.setText(EMPTY_STRING);

Comme 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.

32voto

Peter Lawrey Points 229686

Si vous voulez comparer avec la chaîne vide sans se soucier des valeurs null, vous pouvez effectuer les opérations suivantes.

if ("".equals(text))

En fin de compte, vous devriez faire ce que vous croyez est la plus claire. La plupart des programmeurs assumer "" désigne une chaîne vide, pas une chaîne quelqu'un a oublié de mettre n'importe quoi dans.

Si vous pensez qu'il ya un avantage de performance, vous devez le tester. Si vous ne pense pas que son essai de la valeur pour vous-même, c'est une bonne indication qu'il n'est vraiment pas la peine.

Il sonne comme vous essayez de résoudre un problème qui a été résolu quand le langage a été conçu plus de 15 ans.

9voto

Freiheit Points 2694

Apache StringUtils résout ce problème aussi.

Des manquements des autres options:

  • isEmpty() - pas null coffre-fort. Si l' chaîne est nulle, déclenche une NPE
  • length() == 0 - nouveau pas null coffre-fort. Aussi, ne pas prendre en compte les espaces de chaînes.
  • Comparaison de VIDE constant - Mai ne pas être null coffre-fort. Les espaces problème

Accordé StringUtils est une autre bibliothèque à traîner, mais il fonctionne très bien et enregistre les charges de temps et les tracas de la vérification pour les valeurs null ou gracieusement la manipulation des Npe.

8voto

Benoit Courtine Points 4484

Si vous voulez vraiment une constante String.EMPTY, vous pouvez créer une classe statique final d’utilitaire nommée « Constantes » (par exemple) dans votre projet. Cette classe maintiendra vos constantes, y compris une chaîne vide...

Dans la même idée, vous pouvez créer zéro, un int constantes... qui n’existent pas dans l’entier de classe, mais comme j’ai commenté, ce serait une douleur d’écrire et de lire :

Etc.

4voto

Donal Fellows Points 56559

Tous ceux - "" littéraux sont le même objet. Pourquoi faire tout ce que supplémentaires de la complexité? C'est juste plus long à taper et moins clair (le coût pour le compilateur est minime). Depuis Java les chaînes de caractères sont des objets immuables, il n'y a jamais besoin de les distinguer entre eux, sauf peut-être à une efficacité de la chose, mais avec le littéral de chaîne vide c'est pas une grosse affaire.

Si vous voulez vraiment un EmptyString constante, de faire vous-même. Mais tout ce qu'il va faire est d'encourager encore plus détaillé code; il n'y aura jamais d' être tout avantage à le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X