Czy używasz StringUtils.EMPTY
zamiast ""
?
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:
Oczywiście nie. Czy naprawdę uważasz, że „” nie jest wystarczająco jasne?
Stałe mają zasadniczo 3 przypadki użycia:
Żadne nie mają tutaj zastosowania.
EMPTY
nie 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 ONE
i udawania, że warto było używać tej stałej zamiast wartości.
Używam StringUtils.EMPTY
, aby ukryć dosłowne, a także wyrazić, że return StringUtils.EMPTY
był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 EMPTY
jest bardziej wyrazisty.
StringUtils.EMPTY
mniej wyrazisty niż ""
.
""
ż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.
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 StringUtils
zamiast ""
. Nie oznacza to jednak, że powinieneś go używać.
Jeśli na chodniku jest kamień, nie musisz go rzucać.
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.
Dodam tutaj moje dwa centy, ponieważ nie widzę nikogo mówiącego o String
stażach i inicjalizacji zajęć:
String
literały w źródłach Java są internowane, tworząc dowolny ""
i StringUtils.EMPTY
ten sam obiektStringUtils.EMPTY
może zainicjować StringUtils
klasę, 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 .
StringUtils
klasy.
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).
""
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.
return "";
jest brzydki, ja PREFER użyć zwrotu StringUtil.EMPTY
(zadeklarowanego we własnej klasie StringUtil nie Apache StringUtils ).
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ć.
Szczerze mówiąc, nie widzę żadnego pożytku. Jeśli chcesz porównać np. Z pustym ciągiem, po prostu użyjStringUtils.isNotEmpty(..)
StringUtils.isNotEmpty(..)
wykonuje również kontrolę null, więc nie jest dokładnie tym samym, co porównywanie z pustym ciągiem.
null
? jako drugi argument equals
, ale wynik będzie taki sam -false
isNotEmpty
jest przeciwieństwem "".equals(…)
, a więc fakt, że będzie traktować null
jak 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 true
iff, jest to pusty ciąg i rzucania a, NullPointerException
jeśli ciąg jest null
…
StringUtils.EMPTY
W niektórych przypadkach uważam za przydatne dla czytelności. W szczególności z:
Operator trójskładnikowy np.
item.getId() != null ? item.getId() : StringUtils.EMPTY;
Również przy użyciu stałej StringUtils.EMPTY
tworzone 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.EMPTY
pozwala uniknąć konieczności sprawdzania puli String?
StringUtils.EMPTY
stała jest rozwiązywana w czasie kompilacji.
StringUtil.EMPTY
jest 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.
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 " ";
someString.isEmpty()
zamiast tego.
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:
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?
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łabyStringUtils.EMPTY
zdefiniowana jako własna zmienna, na przykładMyClass.EMPTY
wprowadzenie 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.