Saya mengerti bahwa setiap kali saya mengetik string literal ""
, objek String yang sama direferensikan dalam kumpulan string.
Tetapi mengapa String API tidak menyertakan a public static final String Empty = "";
, jadi saya bisa menggunakan referensi String.Empty
?
Ini akan menghemat waktu kompilasi, paling tidak, karena kompiler akan tahu untuk mereferensikan String yang ada, dan tidak perlu memeriksa apakah itu telah dibuat untuk digunakan kembali, kan? Dan secara pribadi saya pikir proliferasi string literal, terutama yang kecil, dalam banyak kasus adalah "bau kode".
Jadi ada Grand Design Reason di balik tidak ada String.Empty, atau apakah pembuat bahasa tidak berbagi pandangan saya?
outputBlah = ""
, dan ia mungkin lebih sukasomething == String.Empty
lebihsomething.Length > 0
juga (Anda melewatkan cek nol.)String.isEmpty()
fungsi ... mengapa kamu mauString.EMPTY
?String.isEmpty()
tidak mengembalikan string kosong.Jawaban:
String.EMPTY
adalah 12 karakter, dan""
dua, dan keduanya akan merujuk persis contoh yang sama dalam memori saat runtime. Saya tidak sepenuhnya yakin mengapaString.EMPTY
akan menghemat waktu kompilasi, pada kenyataannya saya pikir itu akan menjadi yang terakhir.Terutama mengingat
String
s tidak dapat diubah, ini tidak seperti Anda pertama-tama bisa mendapatkan String kosong, dan melakukan beberapa operasi di atasnya - terbaik untuk menggunakanStringBuilder
(atauStringBuffer
jika Anda ingin menjadi thread-safe) dan mengubahnya menjadi String.Perbarui
Dari komentar Anda ke pertanyaan:
Saya percaya akan sepenuhnya sah untuk memberikan konstanta di kelas yang sesuai:
Dan kemudian referensi seperti dalam kode Anda sebagai
Karena dengan cara ini, setidaknya Anda secara eksplisit menyatakan bahwa Anda menginginkan sebuah String kosong, daripada Anda lupa untuk mengisi String di IDE Anda atau sesuatu yang serupa.
sumber
StringBuilder
tanpa membicarakan tentang bagaimana sembilan dari sepuluh itu benar-benar tidak sesuai untuk digunakanStringBuilder
daripada penggabungan.Menggunakan
org.apache.commons.lang.StringUtils.EMPTY
sumber
""
... dan sebagian besar mungkin akan keberatan keras tentang penggunaanEMPTY
kecuali dalam situasi tertentu di manaEMPTY
memiliki makna domain spesifik. (Dan dalam kasus seperti itu, mungkin ada nama yang lebih tepat.)Jika Anda ingin membandingkan dengan string kosong tanpa khawatir tentang nilai null Anda dapat melakukan hal berikut.
Pada akhirnya Anda harus melakukan apa yang menurut Anda paling jelas. Kebanyakan pemrogram menganggap "" artinya string kosong, bukan string yang seseorang lupa untuk memasukkan apa pun ke dalamnya.
Jika Anda berpikir ada keuntungan kinerja, Anda harus mengujinya. Jika Anda tidak berpikir layak untuk menguji diri sendiri, itu indikasi yang baik itu benar-benar tidak layak.
Sepertinya Anda mencoba menyelesaikan masalah yang diselesaikan saat bahasa tersebut dirancang lebih dari 15 tahun yang lalu.
sumber
if ("" == text)
if ("" == new String())
itu salah. Tes yang lebih baikif(text.isEmpty())
Jika Anda benar-benar menginginkan konstanta String.EMPTY, Anda dapat membuat kelas akhir statis utilitas bernama "Constants" (misalnya) dalam proyek Anda. Kelas ini akan mempertahankan konstanta Anda, termasuk String kosong ...
Dalam ide yang sama, Anda dapat membuat NOL, SATU konstanta int ... yang tidak ada di kelas Integer, tetapi seperti yang saya komentari, akan merepotkan menulis dan membaca:
Dll
sumber
Apache StringUtils mengatasi masalah ini juga.
Gagal dari opsi lain:
Granted StringUtils adalah pustaka lain untuk diseret, tetapi berfungsi dengan sangat baik dan menghemat banyak waktu dan kerumitan memeriksa nol atau menangani NPE dengan anggun.
sumber
"".equals(s)
?Jangan hanya mengatakan "kumpulan memori string digunakan kembali dalam bentuk literal, case closed". Apa yang dilakukan oleh kompiler di bawah tenda bukanlah intinya di sini. Pertanyaannya masuk akal, terutama mengingat jumlah suara yang diterima.
Ini tentang simetri , tanpanya API lebih sulit digunakan untuk manusia. SDK Jawa awal terkenal mengabaikan aturan dan sekarang sudah agak terlambat. Berikut adalah beberapa contoh di atas kepala saya, jangan ragu untuk chip dalam contoh "favorit" Anda:
sumber
Semua
""
literal itu adalah objek yang sama. Mengapa membuat semua kompleksitas ekstra itu? Hanya lebih lama untuk mengetik dan kurang jelas (biaya untuk kompiler minimal). Karena string Java adalah objek yang tidak dapat diubah, tidak perlu sama sekali untuk membedakannya kecuali mungkin sebagai hal yang efisien, tetapi dengan string kosong literal itu bukan masalah besar.Jika Anda benar-benar menginginkan
EmptyString
konstanta, buatlah sendiri. Tetapi yang harus dilakukan hanyalah mendorong kode verbose yang lebih banyak; tidak akan pernah ada manfaat untuk melakukannya.sumber
x = String.Empty
menyampaikan maksud lebih baik daripadax = ""
. Yang terakhir ini bisa merupakan kelalaian yang tidak disengaja. Mengatakan bahwa tidak pernah ada manfaat adalah salah.x = String.Empty
menyampaikan maksud, benar. Tapi anggaplah bahasanya memberikan konstantaString.Empty
, ketika Anda bertemux = ""
Anda masih tahu persis sebanyak tentang niat seolah-olah tidak ada konstan seperti itu. Anda akan perlu menjamin bahwa semua tempat di dunia kode Java di mana string kosong itu intendet tidak digunakan""
untuk mendapatkan informasi yang Anda sebutkan. Ironisnya, C # menggunakan konstanta dan mendorong penggunaannya, jadi seperti yang saya katakan, saya tahu ini adalah diskusi yang sangat diperdebatkan.""
harus ilegal, untuk mengesampingkan kecelakaan. Aku bercanda!Untuk menambahkan apa yang dinyatakan Noel M, Anda dapat melihat pertanyaan ini, dan jawaban ini menunjukkan bahwa konstanta digunakan kembali.
http://forums.java.net/jive/message.jspa?messageID=17122
sumber
Saya mengerti bahwa setiap kali saya mengetikkan String literal "", objek String yang sama dirujuk dalam kumpulan String.
Tidak ada jaminan yang dibuat. Dan Anda tidak dapat mengandalkan itu di aplikasi Anda, itu sepenuhnya tergantung jvm untuk memutuskan.
atau apakah pembuat bahasa tidak membagikan pandangan saya?
Ya. Bagi saya, sepertinya hal prioritas sangat rendah.
sumber
String username = "Bob" + " " + "Smith";
). String yang dibuat secara pemrograman tidak memiliki jaminan diinternir, kecuali jika Anda secara eksplisit meneleponintern()
seperti yang telah Anda nyatakan. Skenario OP menjelaskan penggunaan string kosong literal di""
seluruh kode, yang merupakan kasus di mana pemagangan otomatis akan terjadi.String a = ""; for(int i = 0; i < 100; i++) {a += "a";} String b = ""; for(int i = 0; i < 100; i++) {b += "b";} a.intern(); b.intern();
Sekaranga
danb
arahkan ke lokasi memori yang sama di PermGen. Lihat artikel iniJawaban terlambat, tapi saya pikir itu menambah sesuatu yang baru untuk topik ini.
Tidak ada jawaban sebelumnya yang menjawab pertanyaan awal. Beberapa telah berusaha untuk membenarkan kurangnya konstanta, sementara yang lain telah menunjukkan cara di mana kita dapat menangani kekurangan konstanta. Tetapi tidak ada yang memberikan pembenaran yang meyakinkan untuk kepentingan konstanta, sehingga kekurangannya masih belum dijelaskan dengan baik.
Konstanta akan berguna karena akan mencegah kesalahan kode tertentu dari tanpa disadari.
Katakanlah Anda memiliki basis kode besar dengan ratusan referensi ke "". Seseorang memodifikasi salah satu dari ini sambil menggulir kode dan mengubahnya menjadi "". Perubahan seperti itu akan memiliki peluang besar untuk tidak diketahui dalam produksi, pada titik mana hal itu dapat menyebabkan beberapa masalah yang sumbernya sulit dideteksi.
OTOH, konstanta pustaka yang bernama KOSONG, jika mengalami kesalahan yang sama, akan menghasilkan kesalahan kompilator untuk sesuatu seperti EM PTY.
Menentukan konstanta Anda sendiri masih lebih baik. Seseorang masih dapat mengubah inisialisasi karena kesalahan, tetapi karena penggunaannya yang luas, dampak kesalahan seperti itu akan jauh lebih sulit untuk diketahui tanpa kesalahan daripada kesalahan dalam kasus penggunaan tunggal.
Ini adalah salah satu manfaat umum yang Anda dapatkan dari menggunakan konstanta alih-alih nilai literal. Orang biasanya menyadari bahwa menggunakan konstanta untuk nilai yang digunakan di banyak tempat memungkinkan Anda dengan mudah memperbarui nilai itu hanya di satu tempat. Apa yang jarang diakui adalah bahwa ini juga mencegah nilai dari modifikasi yang tidak disengaja, karena perubahan seperti itu akan terlihat di mana-mana. Jadi, ya, "" lebih pendek dari KOSONG, tetapi KOSONG lebih aman untuk digunakan daripada "".
Jadi, kembali ke pertanyaan awal, kita hanya bisa berspekulasi bahwa perancang bahasa mungkin tidak menyadari manfaat menyediakan konstanta untuk nilai-nilai literal yang sering digunakan. Mudah-mudahan, suatu hari nanti kita akan melihat konstanta string ditambahkan di Jawa.
sumber
Bagi mereka yang mengklaim
""
danString.Empty
dapat dipertukarkan atau yang""
lebih baik, Anda sangat salah.Setiap kali Anda melakukan sesuatu seperti myVariable = ""; Anda membuat instance objek. Jika objek String Java memiliki konstanta publik KOSONG, hanya akan ada 1 instance dari objek ""
Misalnya: -
10 (11 termasuk String.EMPTY) Pointer ke 1 objek
Atau: -
10 pointer ke 10 objek
Ini tidak efisien dan di seluruh aplikasi besar, bisa signifikan.
Mungkin kompiler Java atau run-time cukup efisien untuk secara otomatis mengarahkan semua "" instance ke instance yang sama, tetapi mungkin tidak dan membutuhkan pemrosesan tambahan untuk membuat penentuan itu.
sumber
if (text == "")