StringUtils.EMPTY önerilir mi?


91

Bunun StringUtils.EMPTYyerine kullanıyor musun ""?

Yani ya bir dönüş değeri olarak ya da bir String değişkeninin değerini ayarlarsanız. Karşılaştırmayı kastetmiyorum çünkü orada kullanıyoruzStringUtils.isEmpty()

Yanıtlar:


111

Tabii ki değil. Gerçekten "" nin yeterince net olmadığını düşünüyor musun?

Sabitlerin esasen 3 kullanım durumu vardır:

  1. Bir değerin anlamını belgeleyin (sabit isim + javadoc ile)
  2. İstemcileri ortak bir değerde senkronize edin.
  3. Bazı başlatma maliyetlerinden kaçınmak için özel bir değere kısayol sağlayın

Hiçbiri burada geçerli değildir.


33
Hala küçük ve nadir bir kullanım durumu görüyorum StringUtils.EMPTY. Boş String kullanımının amaçlandığını ve bir tür tembellik olmadığını açıkça ortaya koyuyor ("Oh, bu bir String gerektirir, hadi geçelim """). Birisi bu kod parçasına ulaşırsa, değişiklik yapmadan önce iki kez düşünecektir. Ayrıca, StringUtils.EMPTYkendi değişkeniniz olarak tanımlanmış MyClass.EMPTYolsaydınız , örneğin "boşluğun bu gösteriminde" değişiklik yapmak bir satır kodun değiştirilmesini gerektirirdi. Örneğin, "<empty>"boş Dize yerine bunu değiştirebilirsiniz "". Ama bence bu biraz fazla ileri gidiyor.
Timmos

5
Sonunda, her seferinde kendi başıma düşünmek yerine, fanatikleri yönlendirmem gereken mantıklı bir argümanım var. Teşekkürler.
Alex

2
BOŞ nasıl anlamsız? EMPTY, listenizdeki hem 1 hem de 2'yi karşılar. Deneyimli geliştiriciler, genç geliştiricilerin "" kullanmak kadar basit bir şeyi bozma potansiyelini ciddi şekilde küçümsüyorlar.
Andrew T Finnell

4
@AndrewTFinnell ad EMPTY, boş dizgenin zaten sahip olmadığı herhangi bir anlam taşımıyor. En önemlisi, o durumda neden boş bir dizge kullanmaya karar verdiğinizi belgelemiyor . Bir sabiti adlandırmak ONEve değer yerine bu sabiti kullanmanın bir anlamı varmış gibi davranmaktan farklı değildir .
Holger

6
Olumsuz oylar sadece, hayır, aslında "" yeterince açık olmadığını düşündüğüm için :( Boş mu? Boş mu? Yazı tipi boyutum küçük olduğu için göremediğim bir boşluk var mı? Herhangi bir garip "görünmez" karakter var mı?
Dan Rayson

60

StringUtils.EMPTYBirebir olanı gizlemek için ve aynı zamanda return StringUtils.EMPTYtamamen beklenen ve boş bir dizge dönmesi gerektiğini ifade etmek için kullanıyorum , kolayca başka bir şeye dönüştürülebilecek ve bunun belki de sadece bir hata olduğu ""varsayımına yol açabilir "". Bence EMPTYdaha anlamlı.


37
Bunu öneren diğerlerine göre: SIFIR'ı 0 için ve BİR'i 1 için de kullanıyor musunuz?
Jon Skeet

9
Özel 'boş' durumu tamsayı değişmezinin kullanımıyla karşılaştırmazdım.
Christopher Klewes

16
Daha StringUtils.EMPTY az etkileyici buluyorum "".
bacar

1
@JonSkeet Size çok saygı duyuyorum. Burada yanlış olduğunu hissediyorum. Siz ve ben bununla asla karşılaşmayabiliriz, ancak bir geliştirici bunu karıştırırsa sözdizimi kontrolü sağlamadığından "" kelimesini kullanmamak için yapılması gereken bir durum var. Ve evet, genç geliştiricilerin "" gibi basit şeyleri berbat ettiğini gördüm. EMPTY'yi "" dışında bir anlama gelecek şekilde değiştirme fikrine inanmıyorum. EMPTY fikrini sadece derleyicinin anlamını anlayabilmesi için seviyorum.
Andrew T Finnell

@AndrewTFinnell: "Yanlış" kesinlikle öznel olması gereken şey için garip bir terim. Hayır, EMPTY'nin anlamını değiştirmesini beklemiyorum, ama ben - bacar gibi - ""kullanmaktan daha anlamlı buluyorum StringUtils.EMPTYve söyledikleriniz bu konuda fikrimi değiştirmedi. Geliştiricilerin çok, çok nadiren boş bir dizeyi yanlış yazdıklarına neredeyse inanabilirim - ancak dizenin netliğini milyonda bir üzerinden alacağım (ve testte kolayca bulunabilir, umarım ... ) hata, şahsen.
Jon Skeet

29

Hayır, sadece kullan "".

Gerçek "", kristal kadar net. Ne kastedildiği konusunda hiçbir yanlış anlama yok. Bunun için neden bir sınıf sabitine ihtiyacınız olduğunu bilmiyorum. Bu sabitin yalnızca içeren StringUtilsyerine içeren paket boyunca kullanıldığını varsayabilirim "". Bu, onu kullanmanız gerektiği anlamına gelmez.

Kaldırımda bir kaya varsa onu fırlatmana gerek yok.


6
"Kaldırımda bir kaya varsa, onu fırlatmana gerek yok." Bunu 6 yaşındaki oğluma söyle.
roel

14

Kaç kişinin "" gerçekten boş bir dizge olduğunu ve (kazara?) Unicode'un harika görünmez ve boşluk bırakmayan karakterlerini içermediğini körü körüne varsaymaktan mutlu olduğuna şaşırdım. İyi ve nezih olan her şeyin aşkı için, mümkün olduğunca BOŞ'u kullanın.


4
Merak ediyorum - bunun kodda olduğunu hiç gördün mü? Öyleyse, yanlışlıkla mı yoksa kasıtlı mı? Kazara yapmak zor görünüyor ve eğer kasıtlıysa, kendi StringUtils sınıfımı boş olmayan bir EMPTY sabiti ile kolayca yaratabilir ve buna başvurabilirdim.
Ian Robertson

5
@IanRobertson Evet, bunun olduğunu gördüm. Aslında oldukça sık. İnsanlar her zaman web sitelerinden ve bir Kod Setinden başka bir Kod Setine kesip yapıştırır. Yine de Clear Case'i kullanan ve daha sonra Windows ISO setine körü körüne çevrilen arkaik bir kod seti kullanan ve Git'e geçerseniz UTF-8'e çevrilen şirketler de vardır. Kod seti sorunlarını çözmek için sayısız saatler harcadım. Bu da dahil.
Andrew T Finnell

3
@AndrewTFinnell Genel olarak bunun sorunlara neden olabileceğini kesinlikle görebiliyorum. Ancak ne sıklıkla boş olmayan boş görünümlü bir String sabiti gördünüz?
Ian Robertson

13

Buraya iki sentimi ekleyeceğim çünkü hiç kimsenin Stringstajyerlik ve Sınıf başlatma hakkında konuştuğunu görmüyorum :

  • Tüm StringJava kaynaklarda sabitler, enterne yapıyoruz herhangi "" ve aynı nesneyeStringUtils.EMPTY
  • Kullanılması StringUtils.EMPTY olabilir başlatmak StringUtilsonun statik üyesi erişir olarak, sınıf EMPTY o ilan edilmemesi durumundafinal (JLS bu noktada özgüdür). Ancak, bir o sınıfı başlatılamıyor böylece, son.org.apache.commons.lang3.StringUtils.EMPTY

JLS 12.4.1'e atıfta bulunarak , String interning ve Sınıf başlatma ile ilgili ilgili cevaba bakınız .


“Nihai ilan edilmemesi durumunda”, bu nedenle bu alan erişen, nihai ilan edilir çünkü olabilir değil başlatılması neden StringUtilssınıfına.
Holger

@Holger bu genel bir ifadeydi ama aslında, javadoc'a son olduğunu gösteren bir bağlantıyla düzenledim (ve bu nedenle sınıfı başlatmayacağım).
Matthieu

8

Daha return "";kısa olduğu için kullanmayı gerçekten sevmiyorum return StringUtils.EMPTY.

Ancak, bunu kullanmanın yanlış bir avantajı, return " ";yerine return "";yazarsanız, farklı davranışlarla karşılaşabilmenizdir (boş bir String'i doğru bir şekilde test edip etmediğinize ilişkin olarak).


13
Bunun gerçekten bir sorun olduğunu hiç gözlemlediniz mi ("" yanlışlıkla "" demek istediğiniz yerde kullanmak)? Şahsen ben kelimenin tam anlamıyla daha okunabilir buluyorum ve bu bana hiçbir zaman sorun çıkarmadı.
Jon Skeet

2
@Jon Hayır, gerçekten, ama onu kullanmanın bir avantajını bulmaya çalıştım;)
Romain Linsolas

1
Eşit zaman kuralı yoktur. Avantaj yoksa avantaj da yoktur.
Erick Robertson

1
Sevmediğim ""bir kez bile sadece bazen, ben tek seferde birden aynı değişmez dize daha yazmaya nefret, ayrıca. Sabitleri Constants.java'da beyan etmeyi, ancak bunları her yerde kaynak kodda tekrar etmemeyi tercih ederim .
賈 可 Jacky

2
Ben DÜŞÜNÜN return ""; çirkin, ben TERCİH getiriyi kullanmak StringUtil.EMPTY(kendi sınıfında ilan StringUtil DEĞİL Apache StringUtils ).
賈 可 Jacky

5

Sınıfınız müştereklerden başka bir şey kullanmıyorsa, sadece bu sihirli değer için bu bağımlılığa sahip olmak yazık olur.

StringUtils'in tasarımcısı bu sabiti yoğun bir şekilde kullanır ve yapılacak doğru şey bu, ancak bu sizin de kullanmanız gerektiği anlamına gelmez.


Yazar bu şekilde gitmeyi seçtiği için kabul edilebilir demek istedim ("sihirli değerleri" kullanmaktan kaçının). Yine de özel olmalı.
cherouvim

Yazar, kodda 0'ı sıklıkla kullanır. Sabit bir int SIFIR = 0 tanımlamaları onlar için daha mı iyi olurdu? Değilse, fark nedir?
Jon Skeet

6
Bu koşullara bağlıdır. Bu bir FCKEditorStringUtils olsaydı, EMPTY değeri "<p> & nbsp </p>" olurdu ve sınıfın her yerinde bu sihirli değeri kopyalamak yerine EMPTY'nin yeniden kullanıldığını görmeyi tercih ederim. Dolayısıyla, EMPTY derken muhtemelen EMPTY_CONTENT anlamına gelirler ve EMPTY_STRING'i kastetmezler (bu nedenle SIFIR örneğiniz biraz haksızdır) Bir ERROR_VISA_INVALID = 0 sabitini yeniden kullanmaz mısınız?
cherouvim

1

Dürüst olmak gerekirse, ikisinin de pek kullanımını görmüyorum. Boş bir dizeyle karşılaştırmak istiyorsanız, sadece şunu kullanın:StringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)Ayrıca boş bir dizge ile karşılaştırmakla tam olarak aynı olmayacak şekilde bir nullcheck yapar.
cherouvim

ve nasıl kamp yapacaksınız null? 2. argüman olarak equals, ancak sonuç aynı olacak -false
Bozho

isNotEmptytersidir "".equals(…), bu nedenle, tedavi gerçeği nullboş dize gibi olan boş bir dize ile karşılaştırarak farklı "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false. Eğer bir dizgenin boş olup olmadığını bilmek istiyorsanız, boş bir dizge ise string.isEmpty()döndürmek trueve NullPointerExceptioneğer dizge ise a atmak için doğru davranışa sahip olan kullanın null
Holger

1

StringUtils.EMPTYOkunabilirlik açısından bazı durumlarda faydalı buluyorum . Özellikle şunlar ile:

  1. Üçlü operatör ör.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. Bir yöntemden boş String döndürmek, evet olduğunu doğrulamak için gerçekten bunu yapmak istedim.

Ayrıca bir sabit kullanılarak bir referans StringUtils.EMPTYoluşturulur. Aksi takdirde, Dize değişmezini ""her seferinde başlatmaya çalışırsanız , JVM, Dize havuzunda zaten var olup olmadığını kontrol etmek zorunda kalacaktır (ki muhtemelen olacaktır, dolayısıyla fazladan örnek oluşturma ek yükü yoktur). Şüphesiz kullanmak StringUtils.EMPTY, String havuzunu kontrol etme ihtiyacını ortadan kaldırır?


4
Çoklu aramalarla ilgili argümanınız geçerli değil. Java Dil Belirtimi 3.0'ın 13.4.9 bölümünde, StringUtils.EMPTYsabitin derleme zamanında çözüldüğünden bahsedilir .
Roland Illig

4
Dize havuzundaki mevcudiyet, derleme zamanında ve sınıf yükleme zamanında kontrol edilir, böyle bir ifadeyi her çalıştırdığınızda çalışma zamanında değil,
Marquis of Lorne

1
Bu yana StringUtil.EMPTYbir derleme zaman sabitidir, buna bir referans kullanılarak tam olarak aynı bayt kodu derlenmiş ""şirketinden. Dahası, üçlü operatörün neden herhangi bir fark yaratması gerektiğini anlamıyorum. Diğerleri gibi bir ifade. Adlandırılmış bir sabiti kullanmak veya kullanmamak için herhangi bir neden, üçlü operatör için de geçerlidir.
Holger

1

Hayır, çünkü yazacak daha çok şeyim var. Ve boş bir String plattform bağımsız boştur (Java'da).

File.separator "/" veya "\" den daha iyidir.

Ama istediğin gibi yap. Gibi bir yazım hatası alamazsınızreturn " ";


7
Çoğu programcının neden "çok fazla" yazmaktan bu kadar korktuğunu tam olarak anlamıyorum. StringUtils.EMPTY yazarak, okunması daha kolay olan kendi kendine yorum yapan kodu elde edersiniz. Ve Steve McConnell'e göre (veya Code Complete 2.0'da alıntıladığı bir çalışma) kod, yazıldığından 7 kat daha fazla okunur.
Paweł Dyda

1
Özellikle haklısınız, AMA: "" .equals (someString) 'i okumak StringUtils.EMPTY.equals (someString) kadar kolaydır
Christian Kuetbach

StringUtils.EMPTY.equals (someString) yanlış yazarsanız bir Sözdizimi hatasıyla sonuçlanır. "" .equals (someString) olmayacak. EMPTY kullanmanın tek nedeni budur.
Andrew T Finnell

1
@AndrewTFinnell bu yüzden aklı başında programcılar someString.isEmpty()onun yerine yazarlar .
Holger

-2

Evet, mantıklı. Gidilecek tek yol bu olmayabilir ama bunun "mantıklı olmadığını" söylerken çok az şey görebiliyorum.

Bence:

  • "" Den daha fazla öne çıkıyor.
  • Boş demek istediğinizi ve bu boşluğun muhtemelen işe yaramayacağını açıklıyor.
  • Kendi değişkeninizi tanımlamaz ve birden çok yerde kullanmazsanız yine de her yerde değişmeniz gerekecektir.
  • Kodda serbest dize değişmezlerine izin vermezseniz, bu yardımcı olur.

It will still require changing everywhere if you don't define your own variable and use it in multiple places.boş bir dizeyi farklı bir boş dizeye mi değiştireceksiniz?
Pita

@ Pita Üzgünüm, bu kötü ifadeydi. Bunu "" yerine "" satır içi kullanırsanız, kendi sabitinizi tanımlamak ve birden fazla yerde yeniden kullanmakla aynı faydaları elde edemeyeceğinizi söylemek istedim. Bu StringUtils.EMPTY için bir argüman değil, 'mantıklı' olsa bile fazla bir şey anlamadığınız bir açıklamadır. Kişisel olarak, tanımlayıcı bir adla bir sabit oluşturup sonra bunu atardım. Bir geliştiricinin tek bir alan amaçladığı ve bu formda olmayan boş bir dizeyle sonuçlandığı birkaç durum gördüm.
Oron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.