Ketika membandingkan variabel string ke string literal dengan .equals (), apakah ada praktik standar untuk urutan item? [Tutup]

11

Ada manfaat untuk masing-masing dan saya mengerti perbedaannya, tetapi apa yang dianggap praktik terbaik / standar? Dan mengapa?

Sebagai contoh :

"myString".equals(myStringVar)
  • Menghindari NPE potensial dan tidak memerlukan pemeriksaan nol. (Hal baik?)
  • Lebih bersih untuk dibaca karena tidak diperlukan cek nol.
  • Jika nol bukan nilai yang diharapkan, program Anda bisa rusak tanpa menjadi lebih bijak.

Namun

myStringVar.equals("myString")
  • Memerlukan pemeriksaan nol jika nol adalah nilai yang diharapkan. (Hal baik?)
  • Dapat mengacaukan kondisional majemuk dengan cek nol.
  • Mengizinkan NPE memberi tahu kami jika ada sesuatu yang rusak.

Variasi mana yang dianggap sebagai standar yang digunakan untuk Java, dan mengapa?

BrandonV
sumber
2
Apakah null atau tidak adalah nilai yang diharapkan, haruskah operasi "sama dengan" menjadi tempat untuk menentukan bahwa ini adalah masalah?
Matthew Flynn
Saya kira tidak. Tapi itu menurut saya. Saya ingin mendengar alasan orang lain.
BrandonV
Dalam bahasa yang menggunakan = dan / atau == untuk penugasan / perbandingan itu biasanya praktik terbaik untuk meletakkan hal yang tidak dapat berubah di sebelah kiri sehingga Anda tidak dapat melakukan tugas yang tidak disengaja ketika Anda ingin melakukan perbandingan. Untuk bahasa yang menggunakan metode pada objek seperti .equals, saya rasa itu tidak penting.
GordonM

Jawaban:

3

Saya menduga bahwa ini berasal dari tindakan pencegahan keamanan yang digunakan saat pemrograman dalam C yang lebih tua (atau C ++). Di C, Anda bisa secara tidak sengaja memberikan nilai saat Anda bermaksud menguji kesetaraan:

if (x = 3)

Kondisi ini akan selalu benar, karena tugasnya nilai xa 3, tidak menguji bahwa x sama dengan 3. Untuk menghindari bug halus ini, pengembang mulai membalikkan kondisi:

if (3 = x)

Ini mengandung "bug" yang sama, tetapi akan menghasilkan kesalahan kompiler, jadi lebih aman.

Lebih banyak bahasa modern tidak memiliki masalah ini, dan mereka dapat dengan mudah memperingatkan Anda ketika Anda mencoba melakukan hal-hal semacam ini. Karena itu, tidak ada preferensi murni, jadi pilih satu, dan gunakan secara konsisten.

Oleksi
sumber
-1 Ini bukan alasan konvensi Java equals. Tidak seperti di C, masalah untuk Java adalah bahwa ekspresi x.equals(y)akan melempar NPE ketika xnol. Jika Anda memiliki String literal "something"dan Anda ingin menganggap case nullsebagai "not equals", masuk akal untuk menulis "something".equals(y)jika Anda tidak tahu apakah ybisa nol. Ini tidak akan pernah menghasilkan NPE.
Andres F.
1
  • Standar dan praktik yang baik akan berbeda dengan budaya organisasi tempat Anda bekerja

  • Standar kami dalam. NET adalah myStringVar == "myString"hanya karena kami telah menyetujuinya, yaitu kami yakin itu bersih dan mudah digunakan

Catatan: Ini tidak berlaku untuk Java karena ==membandingkan referensi, bukan objek itu sendiri. Di Jawa Anda harus menggunakan myStringVar.equals("myString").

CodeART
sumber
3
Setidaknya di Jawa, jangan gunakan ==karena hanya membandingkan referensi objek. Yang mengatakan, +1 untuk setimen - konvensi sering mendefinisikan cara yang "benar" dalam melakukan sesuatu.
Michael K
Terima kasih telah menunjukkan ini! Saya telah memperbarui jawabannya :)
CodeART
@ CodeWorks: Saya pikir Anda melewatkan poin Michael. Juga, Java bukan JAVA.
amara
Pertanyaannya adalah: "tetapi apa yang dianggap praktik terbaik / standar? Mengapa?" Jawaban saya adalah standar dan praktik terbaik bervariasi dari satu organisasi ke organisasi lain. Apakah Anda tidak setuju dengan itu?
CodeART
@CodeWorks: Tidak ada yang bisa tidak setuju dengan itu, CodeWorks. Tetapi semua orang bisa setuju bahwa itu myStringVar == "myString"adalah ide yang sangat buruk di Jawa (kecuali jika Anda benar-benar yakin myStringVardiinternir).
amara
0

Saya pikir Anda benar dalam hal itu tergantung pada semantic nullness dari variabel. Jika Anda tidak mengharapkannya menjadi nol dan tidak perlu memeriksa dan menanganinya maka bentuk pertama adalah bersih.

Yang mengatakan, daripada menanamkan string literal, opsi yang lebih baik mungkin adalah ini:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

Terutama jika ada potensi untuk menggunakan string di lebih dari satu.

Benjamin Wootton
sumber
2
-1: sebenarnya tidak lebih baik; menambahkan kekacauan dengan nilai yang biasanya diabaikan
amara
@sparkleshy - Tidak setuju, Anda benar-benar tidak ingin string literal ditaburkan melalui logika kode Anda. Seperti yang disebutkan dalam jawaban asli, jika string literal digunakan di lebih dari satu maka saya pasti akan mengatakan untuk refactor mereka.
Benjamin Wootton
Untuk mengatakan itu, Anda harus benar-benar diss python, karena dalam python, pengidentifikasi pada dasarnya ADALAH string literal. Dan saya pikir kita semua harus setuju bahwa python adalah bahasa yang baik.
amara