String adalah kelas yang tidak dapat diubah di Jawa. Kelas yang tidak berubah hanyalah kelas yang instansnya tidak dapat dimodifikasi. Mengapa bahasa pemrograman Java memilih untuk membuat objek String kelas tidak berubah?
programming-languages
language-design
Tupledev
sumber
sumber
Jawaban:
Masalah ini sangat terkait dengan gagasan tentang apa artinya menjadi turunan dari kelas. Dalam istilah Object-Oriented yang ketat, sebuah kelas memiliki invarian terkait: sebuah predikat yang selalu berlaku saat keluar dari metode (publik) kelas. Gagasan semacam itu penting dalam memastikan bahwa warisan didefinisikan dengan baik, misalnya (itu adalah bagian dari Prinsip Pergantian Liskov ).
Salah satu masalah yang paling merusak dengan Java adalah sulit untuk mencegah kode klien dari melanggar kelas invarian.
Misalnya, pertimbangkan kelas 'Kode Pos' berikut:
Jika String tidak dapat diubah, akan mungkin bagi pengguna ZipCode untuk memanggil 'get' dan mengubah karakter pada waktu berikutnya, sehingga melanggar invarian dan menghancurkan integritas konseptual yang ditawarkan oleh enkapsulasi konsep ZipCode.
Karena integritas semacam ini sangat penting untuk memastikan bahwa sistem besar valid, jawaban untuk pertanyaan Anda ini benar-benar memohon yang lebih luas dari:
"Mengapa Java tidak mendukung analog C ++ const, atau setidaknya menawarkan versi yang tidak dapat diubah dari lebih dari kelas perpustakaan itu?"
sumber
Hal-hal seperti string dan tanggal adalah nilai alami. Dalam istilah C ++, kami berharap mereka memiliki copy constructor, operator penugasan, dan operator kesetaraan, tetapi kami tidak pernah berharap untuk mengambil alamat mereka. Karenanya, kami tidak berharap mereka dialokasikan secara individu di heap. Metode virtual tidak masuk akal.
Objek domain adalah referensi alami. C ++ yang tidak memiliki copy constructor, operator penugasan, atau operator kesetaraan (mereka sama hanya jika identik). Kami dapat mengambil alamat mereka dan kami berharap mereka akan dialokasikan tumpukan. Metode umumnya virtual.
Java tidak memiliki kelas nilai, hanya yang referensi. Nilai dipalsukan dengan benda yang tidak dapat diubah. Ini berlaku untuk string, tetapi sayangnya, tidak untuk kencan. Ketidakstabilan tanggal Jawa telah menyebabkan masalah sering, dan sekarang sudah usang. Nilai yang dapat diubah tidak dapat digunakan sebagai dasar untuk hash, misalnya.
sumber
Java dirancang untuk memungkinkan pelaksanaan subbagian dari kode program di lingkungan yang dibatasi keamanan. Cara persyaratan ini diterapkan adalah dengan menetapkan "SecurityManager" pada utas yang diberi akses ke parameter operasi kritis tertentu (misalnya membuka file) dan bertanya apakah operasi tersebut boleh atau tidak boleh dilanjutkan. Jika Java Strings dapat diubah, sebuah program dapat menghindari pembatasan tersebut dengan membuat dua utas, satu yang melakukan operasi file terbuka yang akan diizinkan sementara yang lain memodifikasi string yang menyimpan nama file ke salah satu yang tidak akan diizinkan. Kemudian ada kemungkinan bahwa manajer keamanan akan membaca string asli, menerima operasi, yang akan diteruskan ke kode pembukaan file yang kemudian akan membuka file kedua (tidak diizinkan).
Kemungkinan yang terakhir akan membuat semua operasi seperti itu berjalan lebih lambat dan akan lebih mungkin untuk implementasi mengandung bug, jadi menggunakan string yang tidak dapat diubah adalah keputusan yang paling masuk akal.
Secara lebih umum, objek yang tidak dapat diubah berguna karena memungkinkan berbagi tanpa perlu membuat salinan defensif (yang mungkin diperlukan bahkan dalam kode non-keamanan-kritis untuk mencegah bug ketika sumber data berubah), sehingga bahkan tanpa persyaratan ini keputusan masih akan diambil. yang masuk akal.
sumber