Kami menerapkan adaptor untuk Jaxen (perpustakaan XPath untuk Java) yang memungkinkan kami untuk menggunakan XPath untuk mengakses model data aplikasi kami.
Ini dilakukan dengan mengimplementasikan kelas yang memetakan string (diteruskan kepada kami dari Jaxen) ke dalam elemen model data kami. Kami memperkirakan kami akan membutuhkan sekitar 100 kelas dengan total perbandingan 1000 string.
Saya pikir cara terbaik untuk melakukan ini adalah pernyataan if / else sederhana dengan string yang ditulis langsung ke dalam kode - daripada mendefinisikan setiap string sebagai sebuah konstanta. Sebagai contoh:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
Namun saya selalu diajarkan bahwa kita seharusnya tidak menanamkan nilai string secara langsung ke dalam kode, tetapi membuat konstanta string sebagai gantinya. Itu akan terlihat seperti ini:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
Dalam hal ini saya pikir itu ide yang buruk. Konstanta hanya akan digunakan sekali, dalam getNode()
metode ini. Menggunakan string secara langsung sama mudahnya dibaca dan dipahami dengan menggunakan konstanta, dan menyelamatkan kita menulis setidaknya seribu baris kode.
Jadi apakah ada alasan untuk mendefinisikan konstanta string untuk penggunaan tunggal? Atau apakah dapat diterima untuk menggunakan string secara langsung?
PS. Sebelum ada yang menyarankan menggunakan enum, kami membuat prototipe, tetapi konversi enum 15 kali lebih lambat dari perbandingan string sederhana sehingga tidak dipertimbangkan.
Kesimpulan: Jawaban di bawah ini memperluas cakupan pertanyaan ini di luar konstanta string, jadi saya punya dua kesimpulan:
- Mungkin OK untuk menggunakan string secara langsung daripada konstanta string dalam skenario ini, tetapi
- Ada beberapa cara untuk menghindari penggunaan string sama sekali, yang mungkin lebih baik.
Jadi saya akan mencoba teknik pembungkus yang menghindari string sepenuhnya. Sayangnya kami tidak dapat menggunakan pernyataan saklar string karena kami belum berada di Java 7. Namun pada akhirnya, saya pikir jawaban terbaik bagi kami adalah mencoba setiap teknik dan mengevaluasi kinerjanya. Kenyataannya adalah bahwa jika satu teknik jelas lebih cepat maka kita mungkin akan memilihnya terlepas dari keindahan atau kepatuhannya pada konvensi.
switch
label. Gunakan sakelar alih-alih if
riam.