Antworten:
Natürlich nicht. Denken Sie wirklich, dass "" nicht klar genug ist?
Konstanten haben im Wesentlichen 3 Anwendungsfälle:
Hier gelten keine.
EMPTYhat 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 ONEund 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.EMPTYes 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 EMPTYist 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 StringUtilsstatt 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 StringInternierung und Klasseninitialisierung spricht :
StringLiterale in Java Quellen sind internieren, so dass jeder "" und StringUtils.EMPTYdas 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 .
StringUtilsKlasse 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 equalsfalse
isNotEmptyist das Gegenteil von "".equals(…)der Tatsache, dass es nullwie 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, truewenn es sich um eine leere Zeichenfolge handelt, und NullPointerExceptionwenn eine Zeichenfolge ausgegeben wird, wird null...
Ich finde StringUtils.EMPTYin 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.EMPTYerstellt. 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.EMPTYvermeidet die Verwendung die Notwendigkeit, den String-Pool zu überprüfen?
StringUtils.EMPTYKonstante zur Kompilierungszeit aufgelöst wird.
StringUtil.EMPTYes 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.EMPTYals Ihre eigene Variable definiertMyClass.EMPTYwä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.