Ada beberapa kasus di mana Anda lebih suka menggunakan peta yang tidak dapat diubah, daftar, set atau jenis koleksi lainnya.
Kasus penggunaan pertama dan yang paling penting adalah setiap kali Anda mengembalikan hasil kueri atau perhitungan yang akan mengembalikan set (atau daftar atau peta) hasil, Anda harus memilih untuk menggunakan struktur data yang tidak dapat diubah.
Dalam hal ini, saya lebih suka mengembalikan versi yang tidak dapat diubah ini karena ini mencerminkan ketidakmampuan faktual dari resultset dari perhitungan yang jauh lebih jelas - tidak peduli apa yang Anda lakukan dengan data nanti, set hasil yang Anda terima dari permintaan Anda seharusnya tidak perubahan.
Kasus penggunaan umum kedua adalah ketika Anda harus memberikan argumen sebagai input untuk metode atau layanan. Kecuali jika Anda mengharapkan pengumpulan input akan dimodifikasi oleh layanan atau metode (yang biasanya merupakan ide desain yang sangat buruk), meneruskan koleksi yang tidak dapat diubah dan bukan yang dapat diubah mungkin merupakan pilihan yang masuk akal dan aman dalam banyak kasus.
Saya menganggapnya sebagai konvensi "lewat nilai" .
Lebih umum - ini adalah praktik yang masuk akal untuk menggunakan struktur data yang tidak berubah kapan pun data melintasi modul atau batas layanan. Ini membuatnya lebih mudah untuk alasan tentang perbedaan antara input / output (tidak berubah) dan keadaan internal yang bisa berubah.
Sebagai efek samping yang sangat menguntungkan dari hal ini adalah peningkatan keamanan dan keselamatan utas modul / layanan Anda dan memastikan pemisahan masalah yang lebih bersih.
Alasan lain yang baik untuk menggunakan Collections.empty*()
metode adalah kurangnya verboseness mereka. Di era pra-Java7, jika Anda memiliki koleksi generik, Anda harus menaburkan anotasi tipe generik di semua tempat.
Bandingkan saja kedua deklarasi ini:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
melawan:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
Yang terakhir jelas memenangkan keterbacaan dengan dua cara penting:
- Dalam deklarasi pertama, seluruh instantiation dari peta kosong dikubur dalam kebisingan deklarasi tipe generik, membuat deklarasi yang pada dasarnya sepele jauh lebih samar daripada yang seharusnya.
- Selain kurangnya penjelasan jenis umum di sisi kanan, versi kedua dengan jelas menyatakan bahwa peta diinisialisasi ke peta kosong. Selain itu - mengetahui bahwa metode ini mengembalikan peta yang tidak dapat diubah, sekarang lebih mudah bagi saya untuk menemukan di mana
fooBarMap
diberikan nilai non-kosong lain hanya dengan mencari /fooBarMap =/
.