Saya tergoda untuk membuat final class CaseInsensitiveString implements CharSequence
.
Ini akan memungkinkan kita untuk mendefinisikan variabel dan bidang jenis ini, daripada menggunakan biasa String
. Kita juga dapat memiliki misalnya a Map<CaseInsensitiveString, ?>
, a Set<CaseInsensitiveString>
, dll.
Apa saja pro dan kontra dari pendekatan ini?
java
strings
case-insensitivity
polygenelubricants
sumber
sumber
Jawaban:
Ketidak sensitifan huruf adalah properti dari perbandingan, bukan dari objek (*). Anda ingin membandingkan string yang sama secara independen dari kasing atau tidak tergantung pada konteksnya.
(Dan Anda memiliki semua jenis cacing karena perbandingan kasusnya tidak sensitif tergantung pada bahasanya - saya menggunakan huruf besar sebagai İ dalam bahasa Turki - dan bahkan konteksnya - tergantung pada kata dan dialeknya ß dapat dituliskan sebagai SS atau SZ dalam bahasa Jerman.)
(*) Ini bisa menjadi properti dari objek yang berisi string, tetapi itu agak berbeda dari menjadi properti dari string itu sendiri. Dan Anda dapat memiliki kelas yang tidak memiliki keadaan kecuali string, dan membandingkan dua contoh dari kelas itu akan menggunakan perbandingan case tidak sensitif dari string. Tetapi kelas itu tidak akan menjadi string tujuan umum karena tidak akan memberikan metode yang diharapkan untuk string tujuan umum dan akan memberikan metode yang tidak. Kelas ini tidak akan disebut CaseInsensitiveString tetapi PascalIdentifier atau apa pun yang berkaitan untuk menggambarkannya. Dan BTW, algoritma perbandingan kasus independen kemungkinan besar akan disediakan oleh tujuannya dan bersifat lokal independen.
sumber
TreeSet<String>
penggunaanString.CASE_INSENSITIVE_ORDER
lebih dari satuHashSet<CaseInsensitiveString>
? Perhatikan bahwa menggunakanTreeSet
saranaO(log n)
untukcontains
. Selain itu, komparator ini tidak konsisten denganequals
, yang berarti bahwa dihasilkan tersebutTreeSet
tidak mematuhi umumSet
kontrak (yaitu hal itu mungkincontains(x)
, meskipun ia tidak memiliki unsur yangequals
kex
).equals()
implementasi pada setiap objek. Ada implementasi default, yang bisa ditimpa oleh objek apa pun. Saya tidak berpikir Anda dapat mendefinisikan hash, tapi kemudian saya tidak pernah mencoba - tabel selalu bekerja dengan baik tanpa khawatir tentang hal itu (satu alasan saya suka Java lebih dari C ++ :)).Tak jauh dari kepala saya:
Pro:
bool UserIsRegistered(CaseInsensitiveString Username)
Cons:
CaseInsensitiveString
untuk menyimpan nama pengguna, meskipun masuk akal untuk memiliki perbandingan back-end case-insensitive, kode front-end akan menampilkan nama pengguna sebagai "bob smith" atau "BOB SMITH"sumber
CaseInsensitiveString bukan ide yang buruk tergantung pada penggunaan Anda, selama Anda tidak mengharapkannya untuk bekerja sama dengan String.
Anda dapat mengonversi CaseInsensitiveString ke String, atau sebaliknya, dan hanya itu yang harus Anda lakukan.
Masalah akan terjadi jika Anda mencoba melakukan sesuatu seperti
Anda pasti akan gagal jika Anda akan membuat perusahaan CaseInsensitiveString Anda dengan String normal, karena Anda akan melanggar simetris dan transitif-ness untuk equals () (dan kontrak lainnya)
Namun, harap tanyakan pada diri sendiri, dalam hal apa Anda benar-benar membutuhkan CaseInsensitiveString ini yang tidak cocok untuk menggunakan String.CASE_INSENSITIVE_ORDER? Saya yakin tidak banyak kasus. Saya yakin akan ada kasus yang layak memiliki kelas khusus ini, tetapi tanyakan pada diri Anda terlebih dahulu.
sumber
Membuat jenis secara eksplisit dalam domain / model Anda adalah praktik yang sangat baik. Seperti yang dikatakan Maxpm, ini adalah dokumentasi sendiri. Juga nilai tambah yang besar: orang tidak dapat (secara tidak sengaja) menggunakan input yang salah. Satu-satunya hal negatif yang dimilikinya adalah bahwa ia akan menakut-nakuti programmer junior (dan bahkan beberapa mediator).
sumber
Kelas CaseInsensitiveString dan pembantunya menambahkan banyak kode dan mereka akan membuat semuanya lebih mudah dibaca daripada metode String.toLoweCase ().
lebih kompleks, kurang mendokumentasikan diri, dan kurang fleksibel daripada
sumber
Implementasi yang paling sering digunakan di web adalah case-sensitive - XML, JavaScript. Dalam hal kinerja, selalu terbaik untuk menggunakan fungsi / properti / objek yang paling tepat untuk setiap kasus.
Jika Anda berurusan dengan struktur - XML atau JS atau yang serupa, sensitivitas huruf adalah penting. Jauh lebih cepat menggunakan pustaka sistem.
Jika Anda berurusan dengan data dalam basis data, seperti yang disebutkan di atas, pengindeksan basis data harus digunakan untuk string case / sensitive case.
Jika Anda menangani data dengan cepat, penting untuk membuat perhitungan biaya konversi yang diperlukan untuk setiap string. Mungkin string harus dibandingkan atau diurutkan entah bagaimana.
sumber