Apakah StringUtils.EMPTY direkomendasikan?

91

Apakah Anda menggunakan, StringUtils.EMPTYbukan ""?

Maksud saya baik sebagai nilai kembali atau jika Anda menetapkan nilai variabel String. Saya tidak bermaksud untuk perbandingan, karena di sana kami menggunakanStringUtils.isEmpty()

keuleJ
sumber

Jawaban:

111

Tentu saja tidak. Apakah menurut Anda "" tidak cukup jelas?

Konstanta pada dasarnya memiliki 3 kasus penggunaan:

  1. Mendokumentasikan arti suatu nilai (dengan nama konstanta + javadoc)
  2. Sinkronkan klien pada nilai yang sama.
  3. Berikan jalan pintas ke nilai khusus untuk menghindari beberapa biaya init

Tidak ada yang berlaku di sini.

David Pierre
sumber
33
Saya masih melihat satu kasus penggunaan kecil dan langka untuk StringUtils.EMPTY. Itu memperjelas bahwa penggunaan String kosong dimaksudkan, dan bukan semacam kemalasan ("Oh, ini membutuhkan String, ayo teruskan """). Jika seseorang menemukan kode ini, dia akan berpikir dua kali sebelum membuat perubahan. Juga, jika StringUtils.EMPTYdidefinisikan sebagai variabel Anda sendiri, seperti MyClass.EMPTY, membuat perubahan pada "representasi kekosongan itu" akan membutuhkan perubahan satu baris kode. Anda dapat, misalnya, mengubahnya menjadi "<empty>"String kosong "". Tapi, saya pikir ini sudah keterlaluan.
Timmos
5
Akhirnya saya memiliki beberapa argumen yang masuk akal untuk meneruskan orang fanatik, alih-alih memikirkan saya sendiri setiap saat. Terima kasih.
Alex
2
Bagaimana KOSONG itu kurang berarti? KOSONG memenuhi 1 dan 2 dalam daftar Anda. Pengembang berpengalaman sangat meremehkan potensi pengembang junior untuk mengacaukan sesuatu yang sederhana seperti menggunakan "".
Andrew T Finnell
4
@AndrewTFinnell nama EMPTYtersebut tidak memiliki arti yang belum dimiliki oleh string kosong itu sendiri. Terutama, itu tidak mendokumentasikan mengapa Anda memutuskan untuk menggunakan string kosong pada kasus tertentu itu. Ini tidak berbeda dengan menamai konstanta ONEdan berpura-pura ada gunanya menggunakan konstanta itu alih-alih nilainya.
Holger
6
Tidak setuju hanya karena, tidak, saya sebenarnya tidak berpikir "" cukup jelas :( Apakah kosong? Apakah kosong? Apakah ada spasi di sana yang tidak dapat saya lihat karena ukuran font saya kecil? Apakah itu dimaksudkan untuk kosong? Apakah ada karakter "tak terlihat" yang aneh?
Dan Rayson
60

Saya menggunakan StringUtils.EMPTY, untuk menyembunyikan literal dan juga untuk mengekspresikan yang return StringUtils.EMPTYsepenuhnya diharapkan dan harus mengembalikan string kosong, ""dapat mengarah pada asumsi yang ""dapat dengan mudah diubah menjadi sesuatu yang lain dan ini mungkin hanya kesalahan. Saya pikir EMPTYlebih ekspresif.

Christopher Klewes
sumber
37
Seperti orang lain yang menyarankan ini: apakah Anda juga menggunakan ZERO untuk 0 dan SATU untuk 1?
Jon Skeet
9
Saya tidak akan membandingkan kasus 'kosong' khusus dengan penggunaan literal integer.
Christopher Klewes
16
Menurut saya StringUtils.EMPTY kurang ekspresif daripada "".
bacar
1
@JonSkeet Banyak menghormati Anda. Saya merasa Anda salah di sini. Meskipun Anda dan saya mungkin tidak pernah menjumpai hal ini, ada kasus yang harus dibuat untuk tidak menggunakan "" literal karena tidak menyediakan pemeriksaan sintaks jika pengembang mengacaukannya. Dan ya, saya telah melihat pengembang junior mengacaukan hal-hal sederhana seperti "". Saya tidak percaya pada gagasan untuk mengubah KOSONG menjadi berarti sesuatu yang lain selain "". Saya menyukai gagasan KOSONG hanya karena kompilernya dapat memahami artinya.
Andrew T Finnell
@AndrewTFinnell: "Salah" adalah istilah aneh yang pasti subjektif. Tidak, saya tidak mengharapkan KOSONGAN akan pernah berubah makna, tetapi saya - seperti bacar - menemukan ""lebih ekspresif daripada menggunakan StringUtils.EMPTY, dan apa yang Anda katakan tidak mengubah pikiran saya tentang itu. Saya hanya bisa percaya bahwa pengembang telah salah menulis literal string kosong sangat, sangat sesekali - tapi saya akan mengambil kejelasan literal string dari sekali dalam sejuta (dan mudah ditemukan dalam pengujian, mudah-mudahan ... ) bug, secara pribadi.
Jon Skeet
29

Tidak, gunakan saja "".

Secara literal ""jelas seperti kristal. Tidak ada kesalahpahaman tentang apa yang dimaksud. Saya tidak tahu mengapa Anda membutuhkan konstanta kelas untuk itu. Saya hanya dapat berasumsi bahwa konstanta ini digunakan di seluruh paket yang berisi, StringUtilsbukan "". Itu tidak berarti Anda harus menggunakannya.

Jika ada batu di trotoar, Anda tidak perlu membuangnya.

Erick Robertson
sumber
6
"Jika ada batu di trotoar, Anda tidak perlu membuangnya." Katakan itu pada anakku yang berumur 6 tahun.
roel
14

Saya kagum pada berapa banyak orang yang dengan senang hati berasumsi bahwa "" memang sebuah string kosong, dan tidak (secara tidak sengaja?) Mengandung karakter Unicode yang tidak terlihat dan tidak memiliki spasi. Untuk cinta semua yang baik dan layak, gunakan KOSONG kapan pun Anda bisa.

j__m
sumber
4
Saya penasaran - apakah Anda pernah melihat ini terjadi dalam kode? Jika ya, apakah itu tidak disengaja atau disengaja? Tampaknya sulit untuk dilakukan secara tidak sengaja, dan jika disengaja, saya dapat dengan mudah membuat kelas StringUtils saya sendiri dengan konstanta KOSONG yang tidak kosong, dan merujuk ke sana.
Ian Robertson
5
@IanRobertson Ya, saya telah melihat ini terjadi. Sebenarnya cukup sering. Orang-orang memotong dan menempelkan dari situs web sepanjang waktu dan dari satu Kumpulan Kode ke Kumpulan Kode lainnya. Ada juga perusahaan yang masih menggunakan Clear Case yang menggunakan kumpulan kode kuno, yang kemudian secara membabi buta diterjemahkan ke dalam kumpulan ISO windows, dan kemudian diterjemahkan ke dalam UTF-8 jika Anda pindah ke Git. Saya telah menghabiskan waktu berjam-jam untuk memperbaiki masalah kumpulan kode. Termasuk yang satu ini.
Andrew T Finnell
3
@AndrewTFinnell Saya pasti bisa melihat bagaimana secara umum, hal itu dapat menyebabkan masalah. Tetapi seberapa sering Anda secara spesifik melihat konstanta String yang tampak kosong dan tidak kosong?
Ian Robertson
13

Saya akan menambahkan dua sen saya di sini karena saya tidak melihat siapa pun berbicara tentang Stringmagang dan inisialisasi kelas:

  • Semua Stringliteral di sumber Java diinternir, dibuat setiap "" dan StringUtils.EMPTYyang sama objek
  • Menggunakan StringUtils.EMPTY can inisialisasi StringUtilskelas, karena ia mengakses anggota statisnya EMPTY hanya jika tidak dideklarasikanfinal (JLS khusus untuk hal itu). Namun, bersifat final, jadi tidak akan menginisialisasi kelas.org.apache.commons.lang3.StringUtils.EMPTY

Lihat jawaban terkait pada String interning dan inisialisasi Kelas , mengacu pada JLS 12.4.1 .

Matthieu
sumber
“Hanya jika tidak dideklarasikan akhir”, jadi karena bidang ini dinyatakan akhir, mengakses dapat tidak menyebabkan inisialisasi dari StringUtilskelas.
Holger
@Holger itu adalah pernyataan umum tetapi memang, saya mengedit dengan tautan ke javadoc yang menunjukkan itu final (dan dengan demikian tidak akan menginisialisasi kelas).
Matthieu
8

Saya tidak terlalu suka menggunakannya, karena return "";lebih pendek dari return StringUtils.EMPTY.

Namun, satu keuntungan palsu menggunakannya adalah jika Anda mengetik return " ";alih-alih return "";, Anda mungkin mengalami perilaku yang berbeda (terkait apakah Anda menguji dengan benar String kosong atau tidak).

Romain Linsolas
sumber
13
Pernahkah Anda mengamati bahwa ini benar-benar menjadi masalah (menggunakan "" secara tidak sengaja di tempat yang Anda maksud "")? Secara pribadi saya menemukan literal lebih mudah dibaca, dan itu tidak pernah menimbulkan masalah bagi saya.
Jon Skeet
2
@ Jon Tidak, memang, tapi saya mencoba mencari keuntungan dengan menggunakannya;)
Romain Linsolas
1
Tidak ada aturan waktu yang sama. Jika tidak ada keuntungan, maka tidak ada keuntungan.
Erick Robertson
1
Saya juga tidak suka "", saya tidak suka mengetik string literal yang sama lebih dari satu kali, bahkan terkadang hanya sekali. Saya lebih suka mendeklarasikan konstanta di Constants.java , tetapi tidak mengulanginya di semua tempat dalam kode sumber.
賈 可 Jacky
2
SAYA BERPIKIR return ""; jelek, SAYA LEBIH HARUS menggunakan return StringUtil.EMPTY(dideklarasikan di kelas saya sendiri StringUtil , BUKAN StringUtils Apache ).
賈 可 Jacky
5

Jika kelas Anda tidak menggunakan hal lain dari commons maka akan sangat disayangkan memiliki ketergantungan ini hanya untuk nilai ajaib ini.

Perancang StringUtils memanfaatkan banyak konstanta ini, dan ini adalah hal yang benar untuk dilakukan, tetapi itu tidak berarti Anda harus menggunakannya juga.

cherouvim
sumber
Maksud saya itu dapat diterima karena penulis memilih jalan ini (hindari penggunaan "nilai ajaib"). Itu harus pribadi.
cherouvim
Penulis sering menggunakan 0 dalam kode. Apakah akan lebih baik bagi mereka untuk mendefinisikan sebuah konstanta int ZERO = 0 juga? Jika tidak, apa bedanya?
Jon Skeet
6
Itu tergantung konteksnya. Jika ini adalah FCKEditorStringUtils, KOSONGAN mereka akan menjadi "<p> & nbsp </p>" dan saya lebih suka melihat KOSONGAN digunakan kembali daripada mereplikasi nilai ajaib ini di mana pun di kelas. Jadi, dengan KOSONG itu mungkin berarti EMPTY_CONTENT dan bukan EMPTY_STRING (jadi contoh ZERO Anda agak tidak adil). Tidakkah Anda akan menggunakan kembali konstanta ERROR_VISA_INVALID = 0?
cherouvim
1

Sejujurnya, saya juga tidak melihat banyak gunanya. Jika Anda ingin membandingkan misalnya string kosong, gunakan sajaStringUtils.isNotEmpty(..)

Bozho
sumber
2
StringUtils.isNotEmpty(..)juga melakukan pemeriksaan null sehingga tidak persis sama dengan membandingkan dengan string kosong.
cherouvim
dan bagaimana Anda akan berkemah null? sebagai argumen ke-2 equals, tetapi hasilnya akan sama -false
Bozho
isNotEmptyadalah kebalikan dari "".equals(…), oleh karena itu, fakta bahwa itu akan memperlakukan nullseperti string kosong adalah berbeda untuk membandingkan dengan string kosong, "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false. Jika Anda hanya ingin tahu apakah suatu string kosong, gunakan string.isEmpty(), yang memiliki perilaku yang benar dengan mengembalikan trueiff itu adalah string kosong dan melempar NullPointerExceptionjika string itu adalah null
Holger
1

Saya menemukan StringUtils.EMPTYberguna dalam beberapa kasus untuk keterbacaan. Khususnya dengan:

  1. Operator terner misalnya.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. Mengembalikan String kosong dari sebuah metode, untuk mengonfirmasi bahwa ya, saya benar-benar ingin melakukan itu.

Juga dengan menggunakan konstanta, referensi ke StringUtils.EMPTYdibuat. Sebaliknya jika Anda mencoba untuk membuat instance String literal ""setiap kali JVM harus memeriksa apakah sudah ada di kumpulan String (yang kemungkinan besar akan terjadi, jadi tidak ada overhead pembuatan instance tambahan). Tentunya menggunakan StringUtils.EMPTYmenghindari kebutuhan untuk memeriksa kolam String?

Tom
sumber
4
Argumen Anda dengan beberapa pencarian tidak berlaku. Dalam bab 13.4.9 dari Spesifikasi Bahasa Java 3.0, disebutkan bahwa StringUtils.EMPTYkonstanta diselesaikan pada waktu kompilasi.
Roland Illig
4
Keberadaan di kumpulan string diperiksa pada waktu kompilasi dan waktu pemuatan kelas, bukan pada waktu proses setiap kali Anda mengeksekusi pernyataan seperti itu,
Marquis dari Lorne
1
Karena StringUtil.EMPTYadalah konstanta waktu kompilasi, referensi padanya akan dikompilasi ke bytecode yang sama persis seperti yang digunakan ""secara langsung. Lebih jauh, saya tidak mengerti mengapa operator terner harus membuat perbedaan. Itu adalah ekspresi seperti yang lainnya. Alasan apa pun untuk menggunakan atau tidak menggunakan konstanta bernama juga berlaku untuk operator terner.
Holger
1

Tidak, karena saya memiliki lebih banyak untuk ditulis. Dan String kosong adalah plattform independent empty (di Java).

File.separator lebih baik dari "/" atau "\".

Tapi lakukan sesukamu. Anda tidak bisa salah ketikreturn " ";

Christian Kuetbach
sumber
7
Saya tidak mengerti mengapa kebanyakan programmer begitu takut menulis "terlalu banyak". Dengan menulis StringUtils.EMPTY Anda akan mendapatkan kode komentar sendiri, yang lebih mudah dibaca. Dan menurut Steve McConnell (atau beberapa penelitian yang dia kutip dalam Code Complete 2.0) kode dibaca 7 kali lebih banyak daripada yang tertulis.
Paweł Dyda
1
Anda benar, TAPI: "" .equals (someString) semudah membaca StringUtils.EMPTY.equals (someString)
Christian Kuetbach
StringUtils.EMPTY.equals (someString) akan menghasilkan kesalahan Sintaks jika Anda salah menulisnya. "" .equals (someString) tidak akan. Inilah satu-satunya alasan seseorang perlu menggunakan KOSONG.
Andrew T Finnell
1
@AndrewTFinnell itulah sebabnya programmer yang waras menulis someString.isEmpty()sebagai gantinya.
Holger
-2

Ya, itu masuk akal. Ini mungkin bukan satu-satunya cara untuk pergi tetapi saya tidak melihat banyak cara untuk mengatakan ini "tidak masuk akal".

Menurutku:

  • Ini lebih menonjol daripada "".
  • Ini menjelaskan bahwa yang Anda maksud kosong, dan kosong itu kemungkinan besar tidak akan dilakukan.
  • Ini masih perlu diubah di mana-mana jika Anda tidak mendefinisikan variabel Anda sendiri dan menggunakannya di banyak tempat.
  • Jika Anda tidak mengizinkan literal string bebas dalam kode, maka ini membantu.
Oron
sumber
It will still require changing everywhere if you don't define your own variable and use it in multiple places.Anda akan mengubah string kosong menjadi string kosong lain?
Pita
@Pita Maaf, itu kalimat yang buruk. Saya bermaksud mengatakan bahwa jika Anda menggunakan sebaris ini daripada "" Anda masih tidak mendapatkan manfaat yang sama seperti mendefinisikan konstanta Anda sendiri dan menggunakan kembali di banyak tempat. Ini bukan argumen untuk StringUtils.EMPTY, ini adalah penjelasan bahwa Anda tidak mendapatkan banyak meskipun itu 'masuk akal'. Secara pribadi, saya akan membuat konstanta dengan nama deskriptif dan kemudian menetapkan ini. Saya telah melihat beberapa kasus di mana pengembang menginginkan satu spasi dan berakhir dengan string kosong, yang tidak terjadi dengan formulir ini.
Oron