Czy polecany jest StringUtils.EMPTY?


91

Czy używasz StringUtils.EMPTYzamiast ""?

Mam na myśli albo jako wartość zwracaną, albo jeśli ustawisz wartość zmiennej String. Nie mam na myśli porównania, bo tam używamyStringUtils.isEmpty()

Odpowiedzi:


111

Oczywiście nie. Czy naprawdę uważasz, że „” nie jest wystarczająco jasne?

Stałe mają zasadniczo 3 przypadki użycia:

  1. Udokumentuj znaczenie wartości (ze stałą nazwą + javadoc)
  2. Synchronizuj klientów według wspólnej wartości.
  3. Zapewnij skrót do specjalnej wartości, aby uniknąć niektórych kosztów początkowych

Żadne nie mają tutaj zastosowania.


33
Nadal widzę jeden niewielki i rzadki przypadek użycia StringUtils.EMPTY. Wyjaśnia, że ​​zamierzone jest użycie pustego Ciągu, a nie jakiegoś rodzaju lenistwa („Och, to wymaga String, przejdźmy ""”). Jeśli ktoś trafi w ten fragment kodu, dwa razy się zastanowi, zanim wprowadzi zmiany. Ponadto, jeśli zostałaby StringUtils.EMPTYzdefiniowana jako własna zmienna, na przykład MyClass.EMPTYwprowadzenie zmian w „tej reprezentacji pustki” wymagałoby zmiany jednej linii kodu. Możesz na przykład zmienić go na "<empty>"zamiast pustego ciągu "". Ale myślę, że to trochę za daleko.
Timmos

5
W końcu mam rozsądny argument, do którego mogę kierować zelotów, zamiast myśleć za każdym razem samodzielnie. Dzięki.
Alex

2
Jak EMPTY nie ma znaczenia? PUSTY spełnia wymagania 1 i 2 na liście. Doświadczeni programiści poważnie nie doceniają potencjału młodszych programistów, aby zepsuć coś tak prostego, jak użycie „”.
Andrew T Finnell

4
@AndrewTFinnell nazwa EMPTYnie ma żadnego znaczenia, którego sam pusty ciąg nie ma. Przede wszystkim nie dokumentuje, dlaczego zdecydowałeś się użyć pustego ciągu w tym konkretnym przypadku. Nie różni się to od nazywania stałej ONEi udawania, że ​​warto było używać tej stałej zamiast wartości.
Holger,

6
Głosy w dół tylko dlatego, że nie, tak naprawdę nie sądzę, że „” jest wystarczająco jasne :( Czy jest puste? Czy jest puste? Czy jest tam spacja, której nie widzę, ponieważ rozmiar mojej czcionki jest mały? być puste? Czy są jakieś dziwne „niewidzialne” znaki?
Dan Rayson,

60

Używam StringUtils.EMPTY, aby ukryć dosłowne, a także wyrazić, że return StringUtils.EMPTYbyło w pełni oczekiwane i powinien zwrócić pusty ciąg, ""może prowadzić do założenia, że ""można go łatwo zmienić na coś innego i że to może być tylko błąd. Myślę, że EMPTYjest bardziej wyrazisty.


37
Jak inni, którzy to zasugerowali: czy używasz również ZERO dla 0 i ONE dla 1?
Jon Skeet

9
Nie porównałbym specjalnego „pustego” przypadku z użyciem literału liczby całkowitej.
Christopher Klewes

16
Uważam, że jest StringUtils.EMPTY mniej wyrazisty niż "".
Bacar

1
@JonSkeet Wielkie szacunki dla Ciebie. Mam wrażenie, że się tutaj mylisz. Chociaż ty i ja możemy się z tym nigdy nie spotkać, jest przypadek, aby nie używać dosłownego „”, ponieważ nie zapewnia on sprawdzania składni, czy programista nie zepsuje. I tak, widziałem, jak młodsi programiści psują proste rzeczy, takie jak „”. Nie wierzę, że kiedykolwiek zmienię EMPTY na coś innego niż „”. Pomysł EMPTY podoba mi się tylko dlatego, że kompilator jest w stanie zrozumieć jego znaczenie.
Andrew T Finnell

@AndrewTFinnell: „Niepoprawne” to dziwne określenie tego, co z pewnością musi być subiektywne. Nie, nie spodziewam się, że EMPTY kiedykolwiek zmieni znaczenie, ale - podobnie jak Bacar - uważam, ""że jest bardziej wyrazisty niż używanie StringUtils.EMPTY, a to, co powiedziałeś, nie zmieniło mojego zdania na ten temat. Mogę po prostu uwierzyć, że programiści bardzo, bardzo rzadko pisali niepoprawnie pusty ciąg znaków - ale mam nadzieję, że będę miał przejrzystość dosłownego ciągu na poziomie raz na milion (i łatwo go znaleźć w testach, mam nadzieję ... ) błąd osobiście.
Jon Skeet

29

Nie, po prostu użyj "".

Dosłowne ""jest jasne jak kryształ. Nie ma nieporozumień, co miało na myśli. Nie wiedziałbym, dlaczego potrzebujesz do tego stałej klasy. Mogę tylko założyć, że ta stała jest używana w całym pakiecie zawierającym StringUtilszamiast "". Nie oznacza to jednak, że powinieneś go używać.

Jeśli na chodniku jest kamień, nie musisz go rzucać.


6
„Jeśli na chodniku jest kamień, nie musisz go rzucać”. Powiedz to mojemu 6-letniemu synowi.
roel

14

Jestem zdumiony, ilu ludzi jest szczęśliwych, ślepo zakładając, że „” jest rzeczywiście pustym ciągiem i nie zawiera (przypadkowo?) Żadnego cudownego niewidocznego i niezawierającego odstępów znaków Unicode. Z miłości do wszystkiego, co dobre i przyzwoite, używaj PUSTY, kiedy tylko możesz.


4
Jestem ciekawy - czy kiedykolwiek widziałeś to w kodzie? Jeśli tak, to było to przypadkowe czy celowe? Wydawałoby się to trudne do zrobienia przypadkowo, a jeśli celowo, cóż, mógłbym równie łatwo utworzyć własną klasę StringUtils z niepustą stałą EMPTY i odnieść się do niej.
Ian Robertson,

5
@IanRobertson Tak, widziałem, jak to się dzieje. Właściwie dość często. Ludzie cały czas wycinają i wklejają ze stron internetowych iz jednego zestawu kodów do innego zestawu. Istnieją również firmy, które nadal używają Clear Case, który używa archaicznego zestawu kodów, który jest następnie na ślepo tłumaczony na zestaw ISO systemu Windows, a następnie tłumaczony na UTF-8, jeśli przejdziesz na Git. Spędziłem niezliczone godziny naprawiając problemy z zestawem kodu. W tym ten.
Andrew T Finnell

3
@AndrewTFinnell Z pewnością widzę, jak ogólnie może to powodować problemy. Ale jak często widzieliście konkretnie niepustą, wyglądającą na pustą stałą String?
Ian Robertson

13

Dodam tutaj moje dwa centy, ponieważ nie widzę nikogo mówiącego o Stringstażach i inicjalizacji zajęć:

  • Wszystkie Stringliterały w źródłach Java są internowane, tworząc dowolny "" i StringUtils.EMPTYten sam obiekt
  • Używanie StringUtils.EMPTY może zainicjować StringUtilsklasę, ponieważ uzyskuje dostęp do jej statycznego elementu członkowskiego EMPTY tylko wtedy, gdy nie jest zadeklarowanyfinal (JLS jest specyficzny w tym punkcie). Jednak jest ostateczna, więc nie zainicjuje klasy.org.apache.commons.lang3.StringUtils.EMPTY

Zobacz powiązaną odpowiedź na temat internowania ciągów znaków i inicjalizacji klasy , odnosząc się do JLS 12.4.1 .


„Tylko wtedy, gdy nie jest zadeklarowane jako ostateczne”, więc ponieważ to pole jest zadeklarowane jako końcowe, dostęp do niego nie może spowodować inicjalizacji StringUtilsklasy.
Holger

@Holger to było ogólne stwierdzenie, ale rzeczywiście, edytowałem z linkiem do javadoc pokazującym, że jest ostateczny (i dlatego nie zainicjuje klasy).
Matthieu

8

Nie lubię go używać, ponieważ return "";jest krótszy niż return StringUtils.EMPTY.

Jednak jedną fałszywą zaletą korzystania z niego jest to, że jeśli wpiszesz return " ";zamiast return "";, możesz napotkać inne zachowanie (dotyczące tego, czy poprawnie przetestujesz pusty ciąg, czy nie).


13
Czy kiedykolwiek zauważyłeś, że faktycznie jest to problem (użycie "" przypadkowo tam, gdzie miałeś na myśli "")? Osobiście uważam, że dosłowny tekst jest bardziej czytelny i nigdy nie sprawiał mi żadnych problemów.
Jon Skeet

2
@Jon Nie, w rzeczy samej, ale starałem się znaleźć przewagę z używania go;)
Romain Linsolas

1
Nie ma zasady równości czasu. Jeśli nie ma korzyści, nie ma żadnej korzyści.
Erick Robertson

1
Nie podoba mi się ""też, nienawidzę wpisywać tego samego literału więcej niż jeden raz, nawet raz tylko czasami. Wolałbym raczej deklarować stałe w Constants.java , ale nie powtarzać ich wszędzie w kodzie źródłowym.
賈 可 Jacky

2
I THINK return ""; jest brzydki, ja PREFER użyć zwrotu StringUtil.EMPTY(zadeklarowanego we własnej klasie StringUtil nie Apache StringUtils ).
賈 可 Jacky

5

Jeśli twoja klasa nie korzysta z niczego innego ze źródeł wspólnych, szkoda byłoby mieć tę zależność tylko dla tej magicznej wartości.

Projektant StringUtils w dużym stopniu korzysta z tej stałej i jest to słuszne, ale to nie znaczy, że powinieneś również jej używać.


Chodziło mi o to, że jest to dopuszczalne, ponieważ autor zdecydował się pójść tą drogą (unikaj używania „magicznych wartości”). Powinien jednak być prywatny.
cherouvim

Autor często używa 0 w kodzie. Czy byłoby lepiej, gdyby również zdefiniowali stałą int ZERO = 0? Jeśli nie, jaka jest różnica?
Jon Skeet

6
To zależy od kontekstu. Gdyby to był FCKEditorStringUtils, ich EMPTY byłoby „<p> & nbsp </p>” i wolałbym, aby EMPTY został ponownie użyty, zamiast replikować tę magiczną wartość w całej klasie. Tak więc, przez PUSTY prawdopodobnie oznaczają EMPTY_CONTENT, a nie PUSTY_STRING (więc twój przykład ZERO jest trochę niesprawiedliwy). Czy nie użyłbyś ponownie stałej ERROR_VISA_INVALID = 0?
cherouvim

1

Szczerze mówiąc, nie widzę żadnego pożytku. Jeśli chcesz porównać np. Z pustym ciągiem, po prostu użyjStringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)wykonuje również kontrolę null, więc nie jest dokładnie tym samym, co porównywanie z pustym ciągiem.
cherouvim

i jak będziesz się czuć null? jako drugi argument equals, ale wynik będzie taki sam -false
Bozho

isNotEmptyjest przeciwieństwem "".equals(…), a więc fakt, że będzie traktować nulljak pusty ciąg jest inna w porównaniu z pustym ciągiem, "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false. Jeśli chcesz tylko wiedzieć, czy ciąg jest pusty, użyj string.isEmpty(), który ma prawidłowe zachowanie zwracania trueiff, jest to pusty ciąg i rzucania a, NullPointerExceptionjeśli ciąg jest null
Holger

1

StringUtils.EMPTYW niektórych przypadkach uważam za przydatne dla czytelności. W szczególności z:

  1. Operator trójskładnikowy np.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. Zwracanie pustego ciągu z metody, aby potwierdzić, że tak, naprawdę chciałem to zrobić.

Również przy użyciu stałej StringUtils.EMPTYtworzone jest odniesienie do . W przeciwnym razie, jeśli spróbujesz utworzyć wystąpienie literału String za ""każdym razem, gdy maszyna JVM będzie musiała sprawdzić, czy istnieje już w puli String (co prawdopodobnie będzie, więc nie ma dodatkowych kosztów związanych z tworzeniem instancji). Z pewnością użycie StringUtils.EMPTYpozwala uniknąć konieczności sprawdzania puli String?


4
Twój argument z wielokrotnymi odnośnikami nie wytrzymuje. W rozdziale 13.4.9 specyfikacji języka Java 3.0 wspomniano, że StringUtils.EMPTYstała jest rozwiązywana w czasie kompilacji.
Roland Illig,

4
Istnienie w puli ciągów jest sprawdzane w czasie kompilacji i w czasie ładowania klasy, a nie w czasie wykonywania takiej instrukcji,
Marquis of Lorne

1
Ponieważ StringUtil.EMPTYjest to stała czasu kompilacji, odniesienie do niej jest kompilowane do dokładnie tego samego kodu bajtowego, co przy użyciu ""bezpośrednio. Co więcej, nie rozumiem, dlaczego operator trójskładnikowy miałby mieć jakiekolwiek znaczenie. To wyraz jak każdy inny. Każdy powód, aby użyć lub nie używać nazwanej stałej, dotyczy również operatora trójskładnikowego.
Holger

1

Nie, bo mam więcej do napisania. A pusty łańcuch jest pusty niezależnym od platformy (w Javie).

File.separator jest lepsze niż „/” lub „\”.

Ale rób, co chcesz. Nie możesz dostać takiej literówkireturn " ";


7
Całkiem nie rozumiem, dlaczego większość programistów tak boi się pisać „za dużo”. Pisząc StringUtils.EMPTY, uzyskasz samokomentujący kod, który będzie łatwiejszy do odczytania. Według Steve'a McConnell'a (lub według niektórych badań, które cytował w Code Complete 2.0), kod jest czytany 7 razy częściej niż jest napisany.
Paweł Dyda

1
Masz szczególną rację, ALE: „” .equals (someString) jest tak samo łatwe do odczytania jak StringUtils.EMPTY.equals (someString)
Christian Kuetbach

StringUtils.EMPTY.equals (someString) spowoduje błąd składniowy, jeśli wpiszesz go niepoprawnie. „” .equals (someString) nie będzie. To jedyny powód, dla którego należy użyć PUSTY.
Andrew T Finnell

1
@AndrewTFinnell, dlatego rozsądni programiści piszą someString.isEmpty()zamiast tego.
Holger

-2

Tak, to ma sens. Może nie jest to jedyna droga, ale widzę bardzo niewiele w sposobie stwierdzenia, że ​​„nie ma to sensu”.

W mojej opinii:

  • Wyróżnia się bardziej niż „”.
  • Wyjaśnia, że ​​miałeś na myśli puste, a to puste miejsce prawdopodobnie nie wystarczy.
  • Nadal będzie wymagać zmiany wszędzie, jeśli nie zdefiniujesz własnej zmiennej i nie użyjesz jej w wielu miejscach.
  • Jeśli nie zezwalasz na bezpłatne literały ciągów w kodzie, to pomoże.

It will still require changing everywhere if you don't define your own variable and use it in multiple places.zamierzasz zmienić pusty ciąg na inny pusty ciąg?
Pita

@Pita Przepraszamy, to było słabe sformułowanie. Chciałem powiedzieć, że jeśli użyjesz tego inline zamiast "", nadal nie uzyskasz tych samych korzyści, co zdefiniowanie własnej stałej i ponowne użycie w wielu miejscach. To nie jest argument dla StringUtils.EMPTY, to wyjaśnienie, że nie dostajesz wiele, nawet jeśli ma to sens. Osobiście stworzyłbym stałą z opisową nazwą, a następnie ją przypisałbym. Widziałem kilka przypadków, w których programista chciał pojedynczej spacji i skończył z pustym ciągiem znaków, co nie ma miejsca w przypadku tego formularza.
Oron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.