Seperti yang saya pahami, ada beberapa cara (mungkin yang lain juga) untuk membuat salinan dangkal a Map
di Java:
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;
// first way
shallowCopy = new HashMap<String, Object>(data);
// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();
Apakah satu cara lebih disukai daripada yang lain, dan jika ya, mengapa?
Satu hal yang perlu disebutkan adalah bahwa cara kedua memberikan peringatan "Pemeran Tidak Dicentang". Jadi Anda harus menambahkan @SuppressWarnings("unchecked")
untuk menyiasatinya, yang sedikit menjengkelkan (lihat di bawah).
@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
// return a shallow copy of the data map
return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
java
map
clone
shallow-copy
dcp
sumber
sumber
Jawaban:
Itu selalu lebih baik untuk menyalin menggunakan konstruktor salinan.
clone()
di Java rusak (lihat SO: Bagaimana cara mengganti metode klon dengan benar? ).Josh Bloch tentang Desain - Salin Pembuat versus Kloning
Bloch (yang merancang dan mengimplementasikan framework Collection) bahkan melangkah lebih jauh dengan mengatakan bahwa dia hanya menyediakan
clone()
metode hanya "karena orang-orang mengharapkannya". Dia TIDAK benar-benar merekomendasikan untuk menggunakannya sama sekali.Saya pikir perdebatan yang lebih menarik adalah apakah pembuat salinan lebih baik daripada pabrik salinan, tetapi itu adalah diskusi yang berbeda sama sekali.
sumber
Tak satu pun dari keduanya: konstruktor yang Anda maksud ditentukan untuk implementasi HashMap dari sebuah Peta , (serta untuk yang lain) tetapi tidak untuk antarmuka Peta itu sendiri (misalnya, pertimbangkan implementasi Penyedia dari antarmuka Peta: Anda tidak akan menemukan konstruktor itu).
Di sisi lain, tidak disarankan menggunakan
clone()
metode tersebut, seperti yang dijelaskan oleh Josh Bloch.Sehubungan dengan antarmuka Peta (dan pertanyaan Anda, di mana Anda menanyakan cara menyalin Peta, bukan HashMap), Anda harus menggunakan Map # putAll () :
Contoh:
sumber
Map
yang memiliki konstruktor salinan, tidak ada alasan untuk tidak menggunakan konstruktor salinan itu?putAll
Anda tidak perlu mengetahui apakahMap
implementasi yang Anda gunakan memiliki konstruktor salinan atau tidak. Dengan demikian, hanya menyalin konstruktor dariMap
implementasi apa pun yang berlebihan.Salin peta tanpa mengetahui implementasinya:
sumber
<K,V>
parameter tipe untuk membantu memastikan keamanan tipe.