Kekekalan telah dipahami dengan baik untuk beberapa waktu. Python, Java, dan C ++ memiliki model memori berbeda yang membuat perbandingan langsung menjadi sulit. Penulis artikel yang Anda kutip tampaknya tidak tahu C ++.
Seperti dalam Python, Java, dan sebagian besar bahasa multi-paradigma, C dan C ++ memungkinkan mutabilitas secara default. Inilah yang biasanya diinginkan oleh programmer: jika saya memiliki String x
variabel, saya ingin dapat memberikan nilai baru x = "foo"
.
Const-system di C dan C ++ memungkinkan banyak ketidakberdayaan bernuansa yang kurang dalam Python, Java, dan bahkan Scala. Jika fungsi C ++ mengambil a const std::string&
atau a const char*
, ia menjanjikan (dan kompiler memastikan, sampai tingkat tertentu), bahwa fungsi ini tidak akan (tidak bisa!) Mengubah isi string itu. Diberikan objek const, kita hanya bisa memanggil metode objek yang juga ditandai sebagai const. Jika kelas C ++ hanya memiliki anggota publik yang const
, maka objek secara efektif tidak dapat diubah.
Namun, ini kadang membingungkan karena dalam objek C dan C ++ lokasi memori, dan variabel adalah nama untuk lokasi memori. Sebaliknya, variabel dalam Python dan Java adalah nama untuk pointer ke objek. Dalam bahasa dengan semantik referensi, x = y
berarti "buat x arahkan ke objek yang sama dengan y". Karena kita hanya menyalin pointer, ini dimungkinkan dengan objek yang tidak berubah. Dalam bahasa dengan semantik nilai seperti C ++, itu berarti "perbarui konten x
dengan konten y
". Oleh karena itu, jika penugasan kembali suatu variabel diinginkan dalam C atau C ++, variabel tersebut mungkin tidak memiliki tipe const. Untuk melakukan ini dengan objek yang tidak dapat diubah, kita harus menggunakan pointer secara eksplisit.
Bahwa Java dan Python menggunakan objek string yang tidak dapat diubah adalah keputusan desain dasar, tetapi tidak secara langsung terhubung ke manfaat ketetapan dalam lingkungan multithreading. Salah satu alasannya adalah bahwa string literal dalam kode sumber dapat dikumpulkan yang mengurangi jumlah objek. Ini dimungkinkan dalam C / C ++ juga. Dalam C ++ literal "foo"
memiliki tipe const char[4]
(karakter ke-4 adalah terminating '\0'
). Alasan lain adalah bahwa entri dalam set dan kunci dalam dicts / peta tidak boleh diubah. Karena string digunakan secara luas sebagai kunci dict (sebagian besar objek Python adalah dict), immutability menghapus sumber kesalahan yang umum. Di Jawa, alasan lain untuk string yang tidak dapat diubah adalah model keamanan Java. Semua alasan ini sama sekali tidak terkait dengan multithreading.
Jika Jawa dibangun dengan pertimbangan kekekalan, bahasa akan terlihat sangat berbeda. Meskipun sangat terinspirasi oleh C ++, para desainer berusaha keras untuk membuat bahasa yang lebih sederhana, menghilangkan const adalah salah satu langkahnya. Hal Java yang setara dengan referensi const C ++ adalah adaptor atau dekorator yang mengimplementasikan metode mutasi apa pun throws new NotImplementedException()
, dan meneruskan metode non-mutasi panggilan ke koleksi aktual. Fakta bahwa antarmuka java.util interface semua menyiratkan mutabilitas adalah tanda yang jelas bahwa mereka tidak berusaha untuk bahasa pertama-immutability.
Solusi yang diajukan Java untuk memecahkan masalah konkurensi bukanlah kekekalan, tetapi penguncian yang luas. Setiap objek tunggal berisi mutex yang dapat digunakan untuk synchronized
blok atau seluruh metode. Ternyata, itu tidak baik untuk kinerja, tidak skala dengan sangat baik, dan cukup rawan kesalahan - Anda masih harus berurusan dengan negara global yang bisa berubah.