Ich verstehe, dass jedes Mal, wenn ich das String-Literal eingebe ""
, dasselbe String-Objekt im String-Pool referenziert wird.
Aber warum enthält die String-API kein a public static final String Empty = "";
, sodass ich Verweise auf verwenden kann String.Empty
?
Dies würde zumindest Kompilierungszeit sparen, da der Compiler wissen würde, auf den vorhandenen String zu verweisen, und nicht prüfen müsste, ob er bereits zur Wiederverwendung erstellt wurde, oder? Und ich persönlich denke, dass eine Verbreitung von String-Literalen, insbesondere von winzigen, in vielen Fällen ein "Code-Geruch" ist.
Gab es also einen großen Designgrund für kein String.Empty, oder haben die Sprachschöpfer meine Ansichten einfach nicht geteilt?
outputBlah = ""
, und er zieht es wahrscheinlichsomething == String.Empty
übersomething.Length > 0
als auch (Sie einen Null - Check überspringen.)String.isEmpty()
Funktion ... warum willst duString.EMPTY
?String.isEmpty()
gibt keine leere Zeichenfolge zurück.Antworten:
String.EMPTY
ist 12 Zeichen und""
ist zwei, und beide würden zur Laufzeit genau dieselbe Instanz im Speicher referenzieren. Ich bin mir nicht ganz sicher, warumString.EMPTY
ich Zeit beim Kompilieren sparen sollte, tatsächlich denke ich, dass es das letztere sein würde.Insbesondere wenn man bedenkt, dass
String
s unveränderlich sind, ist es nicht so, dass man zuerst einen leeren String abrufen und einige Operationen daran ausführen kann - am besten verwenden Sie einenStringBuilder
(oderStringBuffer
wenn Sie threadsicher sein möchten) und verwandeln diesen in einen String.Update
Von Ihrem Kommentar zur Frage:
Ich glaube, es wäre absolut legitim, eine Konstante in Ihrer entsprechenden Klasse bereitzustellen:
Und verweisen Sie dann wie in Ihrem Code auf
Auf diese Weise weisen Sie zumindest ausdrücklich darauf hin, dass Sie einen leeren String möchten, anstatt zu vergessen, den String in Ihrer IDE oder ähnlichem auszufüllen.
quelle
StringBuilder
ohne darüber zu sprechen, wie neun von zehn es völlig unangemessen ist, es zu verwenden,StringBuilder
anstatt es zu verketten.Verwenden
org.apache.commons.lang.StringUtils.EMPTY
quelle
""
... und die meisten würden wahrscheinlich lautstark gegen die Verwendung vonEMPTY
protestieren, außer in bestimmten Situationen, in denenEMPTY
eine domänenspezifische Bedeutung hat. (Und in solchen Fällen gibt es wahrscheinlich einen passenderen Namen.)Wenn Sie mit einer leeren Zeichenfolge vergleichen möchten, ohne sich um Nullwerte kümmern zu müssen, können Sie Folgendes tun.
Letztendlich sollten Sie das tun, was Ihrer Meinung nach am klarsten ist. Die meisten Programmierer gehen davon aus, dass "" eine leere Zeichenfolge bedeutet, keine Zeichenfolge, in die jemand vergessen hat, etwas einzugeben.
Wenn Sie glauben, dass es einen Leistungsvorteil gibt, sollten Sie ihn testen. Wenn Sie nicht der Meinung sind, dass es sich lohnt, es selbst zu testen, ist dies ein guter Hinweis darauf, dass es sich wirklich nicht lohnt.
Es hört sich so an, als würden Sie versuchen, ein Problem zu lösen, das gelöst wurde, als die Sprache vor mehr als 15 Jahren entworfen wurde.
quelle
if ("" == text)
if ("" == new String())
ist falsch. Ein besserer Testif(text.isEmpty())
Wenn Sie wirklich eine String.EMPTY-Konstante möchten, können Sie in Ihrem Projekt eine statische Endklasse mit dem Namen "Constants" erstellen. Diese Klasse behält Ihre Konstanten bei, einschließlich der leeren Zeichenfolge ...
Mit der gleichen Idee können Sie ZERO, ONE int-Konstanten erstellen, die in der Integer-Klasse nicht vorhanden sind, aber wie ich bereits sagte, wäre es mühsam, zu schreiben und zu lesen:
Usw.
quelle
Apache StringUtils behebt auch dieses Problem.
Fehler der anderen Optionen:
Zugegeben, StringUtils ist eine weitere Bibliothek zum Herumschleppen, funktioniert jedoch sehr gut und spart viel Zeit und Aufwand beim Überprüfen auf Nullen oder beim ordnungsgemäßen Umgang mit NPEs.
quelle
"".equals(s)
?Sagen Sie nicht einfach "Speicherpool von Zeichenfolgen wird in der wörtlichen Form wiederverwendet, Groß- / Kleinschreibung geschlossen". Was Compiler unter der Haube tun, ist hier nicht der Punkt. Die Frage ist vernünftig, insbesondere angesichts der Anzahl der erhaltenen Stimmen.
Es geht um die Symmetrie , ohne sie sind APIs für Menschen schwieriger zu verwenden. Frühe Java-SDKs haben die Regel notorisch ignoriert und jetzt ist es etwas zu spät. Hier sind ein paar Beispiele auf meinem Kopf, zögern Sie nicht, Ihr "Lieblings" -Beispiel einzuspielen:
quelle
Alle diese
""
Literale sind dasselbe Objekt. Warum all diese zusätzliche Komplexität machen? Die Eingabe ist nur länger und weniger klar (die Kosten für den Compiler sind minimal). Da Javas Zeichenfolgen unveränderliche Objekte sind, besteht keine Notwendigkeit, zwischen ihnen zu unterscheiden, außer möglicherweise aus Effizienzgründen, aber mit dem leeren Zeichenfolgenliteral ist das keine große Sache.Wenn Sie wirklich eine
EmptyString
Konstante wollen , machen Sie es selbst. Aber alles, was es tun wird, ist, noch ausführlicheren Code zu fördern. Dies wird niemals von Nutzen sein.quelle
x = String.Empty
vermittelt Absicht besser alsx = ""
. Letzteres könnte eine versehentliche Unterlassung sein. Zu sagen, dass es niemals einen Nutzen gibt, ist falsch.x = String.Empty
vermittelt Absicht, wahr. Angenommen, die Sprache liefert eine KonstanteString.Empty
. Wenn Sie auf etwas stoßenx = ""
, wissen Sie immer noch genau so viel über die Absicht, als ob es keine solche Konstante gäbe. Sie müssen sicherstellen, dass alle Stellen im Java-Code der Welt, an denen eine leere Zeichenfolge angegeben wurde, nicht verwendet""
werden, um den von Ihnen erwähnten Informationsgewinn zu erhalten. Ironischerweise verwendet C # eine Konstante und fördert deren Verwendung. Wie gesagt, ich weiß, dass es sich um eine sehr meinungsgebundene Diskussion handelt.""
illegal sein, um Unfälle auszuschließen. Ich scherze nur!Um das zu ergänzen, was Noel M gesagt hat, können Sie sich diese Frage ansehen. Diese Antwort zeigt, dass die Konstante wiederverwendet wird.
http://forums.java.net/jive/message.jspa?messageID=17122
quelle
Ich verstehe, dass jedes Mal, wenn ich das String-Literal "" eingebe, dasselbe String-Objekt im String-Pool referenziert wird.
Es gibt keine solche Garantie. Und Sie können sich in Ihrer Anwendung nicht darauf verlassen, es liegt ganz bei jvm, zu entscheiden.
oder haben die Sprachschöpfer meine Ansichten einfach nicht geteilt?
Ja. Mir scheint es eine Sache mit sehr niedriger Priorität zu sein.
quelle
String username = "Bob" + " " + "Smith";
). Programmgesteuert erstellte Zeichenfolgen haben keine Garantie für die Internierung, es sei denn, Sie rufen ausdrücklich an,intern()
wie Sie angegeben haben. Das Szenario des OP beschreibt jedoch die Verwendung des leeren Zeichenfolgenliteral im""
gesamten Code. In diesem Fall würde eine automatische Internierung stattfinden.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();
Nun zeigen diea
undb
auf denselben Speicherort in PermGen. Siehe diesen ArtikelSpäte Antwort, aber ich denke, es fügt diesem Thema etwas Neues hinzu.
Keine der vorherigen Antworten hat die ursprüngliche Frage beantwortet. Einige haben versucht, das Fehlen einer Konstante zu rechtfertigen, während andere Wege aufgezeigt haben, wie wir mit dem Fehlen der Konstante umgehen können. Aber niemand hat eine zwingende Rechtfertigung zum Nutzen der Konstanten geliefert, so dass ihr Mangel immer noch nicht richtig erklärt wird.
Eine Konstante wäre nützlich, da sie verhindern würde, dass bestimmte Codefehler unbemerkt bleiben.
Angenommen, Sie haben eine große Codebasis mit Hunderten von Verweisen auf "". Jemand ändert eine davon, während er durch den Code blättert, und ändert sie in "". Eine solche Änderung hätte eine hohe Wahrscheinlichkeit, unbemerkt in die Produktion zu gelangen. Zu diesem Zeitpunkt könnte ein Problem auftreten, dessen Quelle schwer zu erkennen ist.
OTOH, eine Bibliothekskonstante mit dem Namen EMPTY, würde, wenn sie denselben Fehler aufweist, einen Compilerfehler für etwas wie EM PTY erzeugen.
Es ist immer noch besser, eine eigene Konstante zu definieren. Jemand könnte seine Initialisierung immer noch versehentlich ändern, aber aufgrund seiner weit verbreiteten Verwendung wäre es viel schwieriger, die Auswirkungen eines solchen Fehlers unbemerkt zu lassen als einen Fehler in einem einzelnen Anwendungsfall.
Dies ist einer der allgemeinen Vorteile, die Sie durch die Verwendung von Konstanten anstelle von Literalwerten erhalten. Normalerweise wird erkannt, dass Sie durch die Verwendung einer Konstante für einen Wert, der an Dutzenden von Stellen verwendet wird, diesen Wert einfach an nur einer Stelle aktualisieren können. Weniger häufig wird anerkannt, dass dies auch verhindert, dass dieser Wert versehentlich geändert wird, da eine solche Änderung überall angezeigt wird. Also, ja, "" ist kürzer als LEER, aber LEER ist sicherer als "".
Um auf die ursprüngliche Frage zurückzukommen, können wir nur spekulieren, dass die Sprachdesigner diesen Vorteil der Bereitstellung von Konstanten für häufig verwendete Literalwerte wahrscheinlich nicht kannten. Hoffentlich werden eines Tages String-Konstanten in Java hinzugefügt.
quelle
Für diejenigen, die behaupten
""
undString.Empty
austauschbar sind oder die""
besser sind, liegen Sie sehr falsch.Jedes Mal, wenn Sie so etwas wie myVariable = "" tun; Sie erstellen eine Instanz eines Objekts. Wenn das String-Objekt von Java eine leere öffentliche Konstante hätte, gäbe es nur eine Instanz des Objekts ""
Z.B: -
10 (11 einschließlich String.EMPTY) Zeiger auf 1 Objekt
Oder: -
10 Zeiger auf 10 Objekte
Dies ist ineffizient und kann in einer großen Anwendung von Bedeutung sein.
Möglicherweise ist der Java-Compiler oder die Java-Laufzeit effizient genug, um automatisch alle Instanzen von "" auf dieselbe Instanz zu verweisen, dies ist jedoch möglicherweise nicht der Fall und erfordert zusätzliche Verarbeitung, um diese Bestimmung vorzunehmen.
quelle
if (text == "")