Tim Java telah melakukan banyak pekerjaan untuk menghilangkan hambatan pemrograman fungsional di Jawa 8. Secara khusus, perubahan pada java.util Collections melakukan pekerjaan yang bagus untuk mengubah transformasi menjadi operasi yang mengalir sangat cepat. Mengingat betapa baiknya pekerjaan yang telah mereka lakukan dengan menambahkan fungsi kelas satu dan metode fungsional pada koleksi, mengapa mereka benar-benar gagal untuk menyediakan koleksi yang tidak dapat diubah atau bahkan antarmuka koleksi yang tidak dapat diubah?
Tanpa mengubah kode apa pun yang ada, tim Java dapat kapan saja menambahkan antarmuka tidak berubah yang sama dengan yang bisa diubah, minus metode "set" dan membuat antarmuka yang ada diperluas darinya, seperti ini:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
Tentu, operasi seperti List.add () dan Map.put () saat ini mengembalikan nilai boolean atau sebelumnya untuk kunci yang diberikan untuk menunjukkan apakah operasi berhasil atau gagal. Koleksi yang tidak dapat diubah harus memperlakukan metode seperti pabrik dan mengembalikan koleksi baru yang mengandung elemen yang ditambahkan - yang tidak sesuai dengan tanda tangan saat ini. Tapi itu bisa diatasi dengan menggunakan nama metode yang berbeda seperti ImmutableList.append () atau .addAt () dan ImmutableMap.putEntry (). Verbositas yang dihasilkan akan lebih besar daripada manfaat dari bekerja dengan koleksi yang tidak dapat diubah, dan sistem tipe akan mencegah kesalahan memanggil metode yang salah. Seiring waktu, metode lama bisa ditinggalkan.
Menangkan koleksi abadi:
- Kesederhanaan - alasan tentang kode lebih sederhana ketika data yang mendasarinya tidak berubah.
- Dokumentasi - jika suatu metode mengambil antarmuka koleksi yang tidak dapat diubah, Anda tahu itu tidak akan mengubah koleksi itu. Jika suatu metode mengembalikan koleksi yang tidak dapat diubah, Anda tahu Anda tidak bisa memodifikasinya.
- Concurrency - koleksi yang tidak dapat diubah dapat dibagikan secara aman di seluruh utas.
Sebagai seseorang yang telah mencicipi bahasa yang menganggap tidak dapat diubah, sangat sulit untuk kembali ke Wild West dari mutasi yang merajalela. Koleksi Clojure (urutan abstraksi) sudah memiliki semua yang disediakan oleh koleksi Java 8, plus ketidakmampuan (meskipun mungkin menggunakan memori dan waktu ekstra karena daftar tautan yang disinkronkan alih-alih streaming). Scala memiliki koleksi yang bisa berubah dan tidak dapat diubah dengan satu set operasi penuh, dan meskipun operasi-operasi itu bersemangat, memanggil .iterator memberikan pandangan malas (dan ada cara lain untuk mengevaluasi mereka dengan malas). Saya tidak melihat bagaimana Java dapat terus bersaing tanpa koleksi abadi.
Adakah yang bisa mengarahkan saya ke sejarah atau diskusi tentang ini? Tentunya itu adalah tempat umum.
const
koleksi
Collections.unmodifiable*()
untuk apa. tapi jangan memperlakukan ini sebagai tidak berubah ketika tidak
ImmutableList
dalam diagram itu, orang bisa lewat dalam bisa berubah List
? Tidak, itu pelanggaran LSP yang sangat buruk.