Antworten:
Natürlich nicht. Denken Sie wirklich, dass "" nicht klar genug ist?
Konstanten haben im Wesentlichen 3 Anwendungsfälle:
Hier gelten keine.
EMPTY
hat keine Bedeutung, die die leere Zeichenfolge selbst noch nicht hat. Insbesondere wird nicht dokumentiert, warum Sie sich in diesem speziellen Fall für die Verwendung einer leeren Zeichenfolge entschieden haben. Es ist nicht anders, als eine Konstante zu benennen ONE
und so zu tun, als wäre es sinnvoll, diese Konstante anstelle des Werts zu verwenden.
Ich verwende StringUtils.EMPTY
, um das Literal zu verbergen und um auszudrücken, dass return StringUtils.EMPTY
es vollständig erwartet wurde und eine leere Zeichenfolge zurückgegeben werden sollte, ""
kann dies zu der Annahme führen, dass ""
es leicht in etwas anderes geändert werden kann und dass dies möglicherweise nur ein Fehler war. Ich denke das EMPTY
ist ausdrucksvoller.
StringUtils.EMPTY
weniger ausdrucksstark als ""
.
""
ausdrucksstärker als die Verwendung StringUtils.EMPTY
, und was Sie gesagt haben, hat meine Meinung dazu nicht geändert. Ich kann fast glauben, dass Entwickler sehr, sehr gelegentlich falsch ein leeres String-Literal geschrieben haben - aber ich werde die Klarheit des String-Literal über die einmalige Million nehmen (und hoffentlich beim Testen leicht zu finden sein ... ) Fehler, persönlich.
Nein, einfach benutzen ""
.
Das Wort ""
ist kristallklar. Es gibt kein Missverständnis darüber, was gemeint war. Ich würde nicht wissen, warum Sie dafür eine Klassenkonstante benötigen würden. Ich kann nur davon ausgehen, dass diese Konstante im gesamten Paket verwendet wird, das StringUtils
statt enthält ""
. Das heißt aber nicht, dass Sie es verwenden sollten.
Wenn sich auf dem Bürgersteig ein Stein befindet, müssen Sie ihn nicht werfen.
Ich bin erstaunt darüber, wie viele Menschen gerne blind annehmen, dass "" tatsächlich eine leere Zeichenfolge ist und (aus Versehen?) Keine der wunderbaren unsichtbaren und nicht räumlichen Zeichen von Unicode enthält. Verwenden Sie für die Liebe zu allem, was gut und anständig ist, LEER, wann immer Sie können.
Ich werde meine zwei Cent hier hinzufügen, weil ich niemanden sehe, der über String
Internierung und Klasseninitialisierung spricht :
String
Literale in Java Quellen sind internieren, so dass jeder ""
und StringUtils.EMPTY
das gleiche ObjektStringUtils.EMPTY
kann dieStringUtils
Klasse initialisiert werden , da sie EMPTY
nur dannfinal
auf ihr statisches Element zugreift, wenn sie nicht deklariert ist (das JLS ist in diesem Punkt spezifisch). Ist jedoch endgültig, sodass die Klasse nicht initialisiert wird.org.apache.commons.lang3.StringUtils.EMPTY
Hier finden Sie eine ähnliche Antwort auf String Internierung und auf Klasse Initialisierung , die sich auf die JLS 12.4.1 .
StringUtils
Klasse führen.
Ich benutze es nicht wirklich gerne, da return "";
es kürzer ist als return StringUtils.EMPTY
.
Ein falscher Vorteil der Verwendung besteht jedoch darin, dass bei einer Eingabe return " ";
anstelle von return "";
möglicherweise ein anderes Verhalten auftritt (unabhängig davon, ob Sie eine leere Zeichenfolge korrekt testen oder nicht).
""
, ich hasse es, dieselbe wörtliche Zeichenfolge mehr als einmal zu tippen, sogar einmal nur manchmal. Ich würde Konstanten lieber in Constants.java deklarieren , aber nicht überall im Quellcode wiederholen.
return "";
ist hässlich, ich bevorzuge die Verwendung von return StringUtil.EMPTY
(deklariert in meiner eigenen Klasse StringUtil , NICHT Apaches StringUtils ).
Wenn Ihre Klasse nichts anderes von Commons verwendet, wäre es schade, diese Abhängigkeit nur für diesen magischen Wert zu haben.
Der Designer der StringUtils nutzt diese Konstante intensiv und es ist das Richtige, aber das bedeutet nicht, dass Sie sie auch verwenden sollten.
Ehrlich gesagt sehe ich auch nicht viel Verwendung davon. Wenn Sie beispielsweise eine leere Zeichenfolge vergleichen möchten, verwenden Sie einfachStringUtils.isNotEmpty(..)
StringUtils.isNotEmpty(..)
führt auch einen Nullcheck durch, sodass dies nicht genau dem Vergleich mit einer leeren Zeichenfolge entspricht.
null
? als equals
false
isNotEmpty
ist das Gegenteil von "".equals(…)
der Tatsache, dass es null
wie die leere Zeichenfolge behandelt wird, unterscheidet sich vom Vergleich mit einer leeren Zeichenfolge, "".equals("")
→ true
, "".equals(null)
→ false
, StringUtils.isNotEmpty("")
→ false
, StringUtils.isNotEmpty(null)
→ false
. Wenn Sie nur wissen möchten, ob eine Zeichenfolge leer ist, verwenden Sie string.isEmpty()
, was das richtige Verhalten hat, true
wenn es sich um eine leere Zeichenfolge handelt, und NullPointerException
wenn eine Zeichenfolge ausgegeben wird, wird null
...
Ich finde StringUtils.EMPTY
in einigen Fällen nützlich für die Lesbarkeit. Besonders mit:
Ternärer Operator z.
item.getId() != null ? item.getId() : StringUtils.EMPTY;
Auch unter Verwendung einer Konstante wird ein Verweis auf StringUtils.EMPTY
erstellt. Andernfalls, wenn Sie versuchen, das String-Literal ""
jedes Mal zu instanziieren, muss die JVM prüfen, ob es bereits im String-Pool vorhanden ist (was wahrscheinlich der Fall ist, sodass kein zusätzlicher Aufwand für die Instanzerstellung anfällt). Sicherlich StringUtils.EMPTY
vermeidet die Verwendung die Notwendigkeit, den String-Pool zu überprüfen?
StringUtils.EMPTY
Konstante zur Kompilierungszeit aufgelöst wird.
StringUtil.EMPTY
es sich um eine Konstante zur Kompilierungszeit handelt, wird ein Verweis darauf mit genau demselben Bytecode kompiliert wie bei ""
direkter Verwendung . Außerdem verstehe ich nicht, warum der ternäre Operator einen Unterschied machen sollte. Es ist ein Ausdruck wie jeder andere. Jeder Grund, eine benannte Konstante zu verwenden oder nicht zu verwenden, gilt auch für den ternären Operator.
Nein, weil ich mehr zu schreiben habe. Und ein leerer String ist plattformunabhängig leer (in Java).
File.separator
ist besser als "/" oder "\".
Aber mach was du willst. Sie können keinen Tippfehler wie bekommenreturn " ";
someString.isEmpty()
stattdessen.
Ja, das macht Sinn. Es ist vielleicht nicht der einzige Weg, aber ich kann sehr wenig daran erkennen, dass dies "keinen Sinn ergibt".
Meiner Meinung nach:
It will still require changing everywhere if you don't define your own variable and use it in multiple places.
Sie werden eine leere Zeichenfolge in eine andere leere Zeichenfolge ändern?
StringUtils.EMPTY
. Es macht deutlich, dass die Verwendung des leeren Strings beabsichtigt ist und nicht irgendeine Art von Faulheit ("Oh, dies erfordert einen String, lass uns gehen""
"). Wenn jemand diesen Code trifft, überlegt er es sich zweimal, bevor er Änderungen vornimmt. Wenn SieStringUtils.EMPTY
als Ihre eigene Variable definiertMyClass.EMPTY
wären, müssten Sie beispielsweise eine Codezeile ändern, um Änderungen an "dieser Darstellung der Leere" vorzunehmen. Sie können es beispielsweise"<empty>"
anstelle des leeren Strings ändern""
. Aber ich denke, das geht etwas zu weit.