Wird StringUtils.EMPTY empfohlen?


89

Verwenden Sie StringUtils.EMPTYstatt ""?

Ich meine entweder als Rückgabewert oder wenn Sie den Wert einer String-Variablen festlegen. Ich meine nicht zum Vergleich, weil wir dort verwendenStringUtils.isEmpty()

Antworten:


106

Natürlich nicht. Denken Sie wirklich, dass "" nicht klar genug ist?

Konstanten haben im Wesentlichen 3 Anwendungsfälle:

  1. Dokumentieren Sie die Bedeutung eines Wertes (mit konstantem Namen + Javadoc)
  2. Synchronisieren Sie Clients mit einem gemeinsamen Wert.
  3. Geben Sie eine Verknüpfung zu einem bestimmten Wert an, um Initialisierungskosten zu vermeiden

Hier gelten keine.


32
Ich sehe immer noch einen kleinen und seltenen Anwendungsfall für 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 Sie StringUtils.EMPTYals Ihre eigene Variable definiert MyClass.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.
Timmos

5
Schließlich habe ich ein vernünftiges Argument, an das ich Eiferer weiterleiten kann, anstatt jedes Mal alleine zu denken. Vielen Dank.
Alex

2
Wie hat LEER keine Bedeutung? LEER erfüllt sowohl 1 als auch 2 in Ihrer Liste. Die erfahrenen Entwickler unterschätzen das Potenzial für Nachwuchsentwickler, etwas so Einfaches wie die Verwendung von "" durcheinander zu bringen.
Andrew T Finnell

4
@AndrewTFinnell Der Name 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.
Holger

5
Abstimmungen, nur weil, nein, ich glaube eigentlich nicht, dass "" klar genug ist :( Ist es leer? Ist es leer? Gibt es dort ein Leerzeichen, das ich nicht sehen kann, weil meine Schriftgröße klein ist? War es beabsichtigt leer sein? Gibt es irgendwelche seltsamen "unsichtbaren" Zeichen?
Dan Rayson

58

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.


37
Wie andere, die dies vorgeschlagen haben: Verwenden Sie auch ZERO für 0 und ONE für 1?
Jon Skeet

9
Ich würde den speziellen 'leeren' Fall nicht mit der Verwendung des Integer-Literal vergleichen.
Christopher Klewes

16
Ich finde StringUtils.EMPTY weniger ausdrucksstark als "".
Bacar

1
@ JonSkeet Viel Respekt für Sie. Ich habe das Gefühl, dass Sie hier falsch liegen. Während Sie und ich möglicherweise nie darauf stoßen, ist es sinnvoll, das Literal "" nicht zu verwenden, da es keine Syntaxprüfung bietet, wenn ein Entwickler es vermasselt. Und ja, ich habe Junior-Entwickler gesehen, die einfache Dinge wie "" durcheinander gebracht haben. Ich mag die Idee nicht, jemals LEER zu ändern, um etwas anderes als "" zu bedeuten. Ich mag die Idee von LEER nur, weil der Compiler seine Bedeutung verstehen kann.
Andrew T Finnell

@ AndrewTFinnell: "Falsch" ist ein seltsamer Begriff für das, was sicherlich subjektiv sein muss. Nein, ich erwarte nicht, dass LEER jemals die Bedeutung ändert, aber ich finde - wie Speck - ""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.
Jon Skeet

29

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.


6
"Wenn es einen Stein auf dem Bürgersteig gibt, musst du ihn nicht werfen." Erzähl das meinem 6-jährigen Sohn.
Roel

14

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.


4
Ich bin neugierig - haben Sie jemals gesehen, dass dies im Code passiert? Wenn ja, war es zufällig oder absichtlich? Es scheint schwierig zu sein, dies versehentlich zu tun, und wenn es absichtlich so wäre, könnte ich genauso gut meine eigene StringUtils-Klasse mit einer nicht leeren EMPTY-Konstante erstellen und darauf verweisen.
Ian Robertson

5
@ IanRobertson Ja, ich habe gesehen, dass dies passiert ist. Eigentlich ziemlich oft. Menschen werden ständig von Websites und von einem Codesatz zu einem anderen Codesatz ausgeschnitten und eingefügt. Es gibt auch Unternehmen, die weiterhin Clear Case verwenden, das einen archaischen Codesatz verwendet, der dann blind in den Windows-ISO-Satz übersetzt und dann in UTF-8 übersetzt wird, wenn Sie zu Git wechseln. Ich habe unzählige Stunden damit verbracht, Probleme mit dem Code-Set zu beheben. Einschließlich dieses.
Andrew T Finnell

3
@ AndrewTFinnell Ich kann sicher sehen, wie im Allgemeinen das Probleme verursachen könnte. Aber wie oft haben Sie speziell eine nicht leere, leer aussehende String-Konstante gesehen?
Ian Robertson

13

Ich werde meine zwei Cent hier hinzufügen, weil ich niemanden sehe, der über StringInternierung und Klasseninitialisierung spricht :

  • Alle StringLiterale in Java Quellen sind internieren, so dass jeder "" und StringUtils.EMPTYdas gleiche Objekt
  • Mit StringUtils.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 .


"Nur wenn es nicht als endgültig deklariert ist". Da dieses Feld als endgültig deklariert ist, kann der Zugriff darauf nicht zur Initialisierung der StringUtilsKlasse führen.
Holger

@Holger das war eine allgemeine Aussage, aber in der Tat habe ich mit einem Link zum Javadoc bearbeitet, der zeigt, dass es endgültig ist (und daher die Klasse nicht initialisiert).
Matthieu

8

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


13
Haben Sie jemals beobachtet, dass dies tatsächlich ein Problem ist (versehentlich "" verwendet, wo Sie "" gemeint haben)? Persönlich finde ich das Wort besser lesbar und es hat mir nie Probleme bereitet.
Jon Skeet

2
@ Jon Nein, in der Tat, aber ich habe versucht, einen Vorteil der Verwendung zu finden;)
Romain Linsolas

1
Es gibt keine Gleichzeitregel. Wenn es keinen Vorteil gibt, gibt es keinen Vorteil.
Erick Robertson

1
Ich mag es auch 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.
y 可 Jacky

2
Ich denke, es return ""; ist hässlich, ich bevorzuge die Verwendung von return StringUtil.EMPTY(deklariert in meiner eigenen Klasse StringUtil , NICHT Apaches StringUtils ).
y 可 Jacky

5

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.


Ich meinte, es ist akzeptabel, da der Autor diesen Weg gewählt hat (vermeiden Sie die Verwendung von "magischen Werten"). Es sollte jedoch privat sein.
Cherouvim

Der Autor verwendet im Code häufig 0. Wäre es für sie besser gewesen, auch eine Konstante int ZERO = 0 zu definieren? Wenn nicht, was ist der Unterschied?
Jon Skeet

6
Das hängt vom Kontext ab. Wenn dies ein FCKEditorStringUtils wäre, wäre ihr LEER "<p> & nbsp </ p>" und ich würde lieber sehen, dass LEER wiederverwendet wird, anstatt diesen magischen Wert überall in der Klasse zu replizieren. Mit EMPTY meinen sie wahrscheinlich EMPTY_CONTENT und nicht EMPTY_STRING (Ihr ZERO-Beispiel ist also etwas unfair). Würden Sie eine Konstante ERROR_VISA_INVALID = 0 nicht erneut verwenden?
Cherouvim

1

Ehrlich gesagt sehe ich auch nicht viel Verwendung davon. Wenn Sie beispielsweise eine leere Zeichenfolge vergleichen möchten, verwenden Sie einfachStringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)führt auch einen Nullcheck durch, sodass dies nicht genau dem Vergleich mit einer leeren Zeichenfolge entspricht.
Cherouvim

und wie wirst du campen null? als equalsfalse
zweites

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

1

Ich finde StringUtils.EMPTYin einigen Fällen nützlich für die Lesbarkeit. Besonders mit:

  1. Ternärer Operator z.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
  2. Rückgabe eines leeren Strings von einer Methode, um zu bestätigen, dass ich das wirklich wollte.

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?


4
Ihr Argument mit den mehreren Suchvorgängen ist nicht zutreffend. In Kapitel 13.4.9 der Java Language Specification 3.0 wird erwähnt, dass die StringUtils.EMPTYKonstante zur Kompilierungszeit aufgelöst wird.
Roland Illig

4
Das Vorhandensein im String-Pool wird zur Kompilierungszeit und zum Laden der Klasse überprüft, nicht zur Laufzeit, wenn Sie eine solche Anweisung ausführen.
Marquis of Lorne

1
Da 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.
Holger

1

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 " ";


7
Ich verstehe nicht, warum die meisten Programmierer so Angst haben, "zu viel" zu schreiben. Durch das Schreiben von StringUtils.EMPTY erhalten Sie selbstkommentierenden Code, der einfacher zu lesen ist. Und laut Steve McConnell (oder einer Studie, die er in Code Complete 2.0 zitiert hat) wird Code siebenmal mehr gelesen als geschrieben.
Paweł Dyda

1
Sie haben besonders Recht, ABER: "" .equals (someString) ist so einfach zu lesen wie StringUtils.EMPTY.equals (someString)
Christian Kuetbach

StringUtils.EMPTY.equals (someString) führt zu einem Syntaxfehler, wenn Sie ihn falsch schreiben. "" .equals (someString) wird nicht. Dies ist der einzige Grund, warum man LEER verwenden muss.
Andrew T Finnell

1
@ AndrewTFinnell, deshalb schreiben vernünftige Programmierer someString.isEmpty()stattdessen.
Holger

-2

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:

  • Es fällt mehr als "" auf.
  • Es erklärt, dass Sie leer gemeint haben und dass leer wahrscheinlich nicht ausreicht.
  • Es muss immer noch überall geändert werden, wenn Sie Ihre eigene Variable nicht definieren und an mehreren Stellen verwenden.
  • Wenn Sie keine freien Zeichenfolgenliterale im Code zulassen, hilft dies.

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?
Pita

@ Pita Sorry, das war eine schlechte Formulierung. Ich wollte damit sagen, dass Sie, wenn Sie diese Inline anstelle von "" verwenden, immer noch nicht die gleichen Vorteile erhalten, wie wenn Sie Ihre eigene Konstante definieren und an mehreren Stellen wiederverwenden. Es ist kein Argument für StringUtils.EMPTY, es ist eine Erklärung, dass man nicht viel bekommt, selbst wenn es "Sinn macht". Persönlich würde ich eine Konstante mit einem beschreibenden Namen erstellen und diese dann entweder zuweisen. Ich habe einige Fälle gesehen, in denen ein Entwickler ein einzelnes Leerzeichen beabsichtigt hat und eine leere Zeichenfolge erhalten hat, was bei diesem Formular nicht der Fall ist.
Oron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.