Apa sajakah situasi di mana saya dapat menggunakan Collections.emptyMap()
? Dokumentasi mengatakan saya bisa menggunakan metode ini jika saya ingin koleksi saya tidak berubah.
Mengapa saya ingin koleksi kosong abadi? Apa intinya?
java
collections
Vinoth Kumar CM
sumber
sumber
[NSArray array]
, itu mengembalikan objek yang meskipun tidak dapat digunakan tetapi ada. Jadi Anda bisa bermain dengannya seperti objek normal dan tidak mendapatkan kesalahan.Jawaban:
Dari Jawa Efektif , Item # 43 -
"Return empty arrays or collections, not null"
menunjukkan kembali koleksi kosong dan bahkan mungkin menunjukkan menggunakan iniemptyList()
,emptySet()
danemptyMap()
metode pada kelas Koleksi untuk mendapatkan koleksi kosong yang juga memiliki manfaat tambahan yang abadi. Dari Item # 15"Minimize Mutability"
.Dari Collections-emptySet-Collections-blankList-Collections
Catatan: Kode di bawah ini hanya sebuah contoh (ubah sesuai dengan kasus penggunaan Anda):
Metode-metode ini menawarkan beberapa keuntungan:
Mereka lebih ringkas karena Anda tidak perlu mengetik secara eksplisit jenis umum koleksi - itu biasanya hanya disimpulkan dari konteks pemanggilan metode.
Mereka lebih efisien karena mereka tidak repot-repot membuat objek baru; mereka hanya menggunakan kembali objek kosong dan tidak ada yang sudah ada. Efek ini umumnya sangat kecil, tetapi kadang-kadang (yah, jarang) penting.
sumber
Set
danHashSet
dalam contoh Anda, karena seluruh titikemptySet()
metode dan teman-teman (yang bertentangan dengan konstantaCollections.EMPTY_SET
dll) adalah bahwa mereka bermain bagus dengan obat generik. Plus, menggunakan fitur (tipe mentah) yang sudah usang sejak Java 5 bukan alat bantu mengajar yang baik.Collection
bukannyanull
untukExceptions
dilempar pada operasi berikut? Menggunakan koleksi yang tidak berubah hanya akan menghasilkan semacam pengecualian lain yang saya bayangkan. Dan menugaskannull
tentu saja tidak kurang efisien daripada menugaskan konstanta yang tidak dapat diubah.public boolean setExists() { return !myset.equals(Collections.emptySet()); }
Memang, menurut pengalaman pribadi saya, sangat berguna jika API membutuhkan kumpulan parameter, tetapi Anda tidak punya apa-apa untuk diberikan. Misalnya, Anda mungkin memiliki API yang terlihat seperti ini, dan tidak mengizinkan referensi nol:
Jika Anda memiliki kueri yang tidak mengambil parameter apa pun, tentu agak boros untuk membuat HashMap, yang melibatkan pengalokasian array, ketika Anda bisa meneruskan 'Empty Map' yang secara efektif merupakan konstanta, cara penerapannya di
java.util.Collections
.sumber
Ada dua konsep berbeda di sini yang tampak aneh ketika dilihat bersama. Lebih masuk akal bila Anda memperlakukan kedua konsep secara terpisah.
Pertama, Anda harus memilih untuk menggunakan koleksi abadi daripada yang bisa berubah kapan saja. Manfaat immuablity didokumentasikan dengan baik di tempat lain .
Kedua, Anda harus memilih untuk menggunakan koleksi kosong daripada menggunakan null sebagai penjaga. Ini dijelaskan dengan baik di sini . Ini berarti Anda akan memiliki kode yang lebih bersih, lebih mudah dipahami, dengan lebih sedikit tempat untuk disembunyikan bug.
Jadi, ketika Anda memiliki kode yang memerlukan peta, lebih baik melewati peta kosong daripada nol untuk menunjukkan tidak adanya peta. Dan sebagian besar waktu ketika Anda menggunakan peta, lebih baik menggunakan peta abadi. Jadi inilah mengapa ada fungsi kenyamanan untuk membuat peta kosong yang tidak dapat diubah.
sumber
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:
melawan:
Yang terakhir jelas memenangkan keterbacaan dengan dua cara penting:
fooBarMap
diberikan nilai non-kosong lain hanya dengan mencari/fooBarMap =/
.sumber
Untuk satu, Anda bisa lolos dengan berbagi referensi. Sebuah
new HashMap()
dll akan memerlukan objek yang dialokasikan, dan mungkin beberapa elemen tambahan untuk menyimpan data, tapi Anda hanya perlu satu salinan dari koleksi abadi kosong (daftar, set, peta, atau seperti lainnya). Ini membuatnya menjadi pilihan yang jelas ketika metode yang Anda panggil perlu menerima Peta tetapi tidak perlu mengeditnya.Saya sarankan memeriksa Java Efektif Josh Bloch , yang mencantumkan beberapa atribut yang sangat bagus dari objek yang tidak dapat diubah (termasuk keamanan utas).
sumber
Ini dapat berguna ketika Anda memiliki fungsi yang mengembalikan
immutable collection
dan dalam beberapa situasi tidak ada data untuk dikembalikan jadi alih-alih kembalinull
Anda dapat mengembalikanemptyMap()
Itu membuat kode Anda lebih mudah dan mencegah
NullPointerException
sumber
Sebagian besar waktu kita gunakan
constructor
untuk membuat yang baruempty map
. TetapiCollections
methods
menawarkan beberapa keuntungan untuk membuatempty map
penggunaanstatic
method
java.util.Collections.emptyMap()
sumber
Untuk alasan yang sama Anda akan gunakan
Collections.unmodifiableMap()
di beberapa titik. Anda ingin mengembalikan instance Peta yang melempar pengecualian jika pengguna mencoba mengubahnya. Ini hanya kasus khusus: Peta kosong.sumber
Untuk alasan yang sama mengapa Anda mungkin menginginkan benda yang tidak dapat diubah. Terutama karena Anda dapat tidur dengan aman di malam hari dalam pengetahuan bahwa banyak utas dapat mengakses instance objek yang sama dan bahwa mereka semua akan melihat nilai yang sama. Tidak memiliki item dalam koleksi masih merupakan nilai yang valid, yang ingin Anda pertahankan.
sumber