Dalam istilah Java, simbol adalah string yang diinternir. Ini berarti, misalnya, perbandingan persamaan referensi ( eq
di Scala dan ==
Java) memberikan hasil yang sama seperti perbandingan persamaan normal ( ==
di Scala dan equals
Java): 'abcd eq 'abcd
akan mengembalikan nilai true, sementara "abcd" eq "abcd"
mungkin tidak, bergantung pada keinginan JVM (yah, seharusnya untuk literal, tetapi tidak untuk string yang dibuat secara dinamis secara umum).
Bahasa lain yang menggunakan simbol adalah Lisp (yang menggunakan 'abcd
seperti Scala), Ruby ( :abcd
), Erlang dan Prolog ( abcd
; mereka disebut atom, bukan simbol).
Saya akan menggunakan simbol ketika saya tidak peduli dengan struktur string dan menggunakannya murni sebagai nama untuk sesuatu. Misalnya, jika saya memiliki tabel database yang mewakili CD, yang menyertakan kolom bernama "harga", saya tidak peduli bahwa karakter kedua dalam "harga" adalah "r", atau tentang nama kolom yang digabungkan; jadi pustaka database di Scala bisa menggunakan simbol untuk nama tabel dan kolom.
Jika Anda memiliki string biasa yang mewakili nama metode dalam kode, yang mungkin diedarkan, Anda tidak menyampaikan sesuatu dengan tepat. Ini adalah semacam masalah batas Data / Kode, tidak selalu mudah untuk menarik garis, tetapi jika kita mengatakan bahwa dalam contoh itu nama metode itu lebih banyak kode daripada data, maka kita ingin sesuatu untuk mengidentifikasi itu dengan jelas .
Symbol Literal ikut bermain di mana ia dengan jelas membedakan sembarang data string lama dengan konstruksi yang digunakan dalam kode. Itu benar-benar ada di mana Anda ingin menunjukkan, ini bukan hanya beberapa data string, tetapi pada kenyataannya di beberapa cara bagian dari kode. Idenya adalah hal-hal seperti IDE Anda akan menyorotnya secara berbeda, dan mengingat perkakasnya, Anda dapat memfaktor ulangnya, daripada melakukan penelusuran / penggantian teks.
Tautan ini membahasnya dengan cukup baik.
sumber
Python memelihara tabel global internal "string internal" dengan nama semua variabel, fungsi, modul, dll. Dengan tabel ini, penerjemah dapat melakukan pencarian dan pengoptimalan yang lebih cepat. Anda dapat memaksa proses ini dengan
intern
fungsi (sys.intern
di python3).Selain itu, Java dan Scala secara otomatis menggunakan "string internal" untuk pencarian yang lebih cepat. Dengan scala, Anda dapat menggunakan
intern
metode ini untuk memaksa bagian dalam string, tetapi proses ini tidak berfungsi dengan semua string. Simbol diuntungkan karena dijamin akan disimpan, jadi pemeriksaan persamaan referensi tunggal sudah cukup untuk membuktikan persamaan atau ketidaksetaraan.sumber