Pelaksanaan Peta Tidak Berubah di Jawa

1. Gambaran keseluruhan

Kadang-kadang lebih disukai untuk tidak membenarkan pengubahsuaian pada java.util.Map seperti berkongsi data baca sahaja di semua utas . Untuk tujuan ini, kita dapat menggunakan Peta yang tidak dapat diubah atau Peta yang tidak dapat diubah.

Dalam tutorial ringkas ini, kita akan melihat apa perbezaan antara mereka. Kemudian, kami akan membentangkan pelbagai cara untuk membuat Peta yang Tidak Berubah.

2. Tidak Boleh Diubah vs Tidak Berubah

Peta Tidak Boleh Diubah hanyalah pembungkus peta yang boleh diubah dan tidak membenarkan pengubahsuaian secara langsung:

Map mutableMap = new HashMap(); mutableMap.put("USA", "North America"); Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America"));

Tetapi peta yang dapat diubah yang mendasari masih dapat diubah dan pengubahsuaiannya dapat dilihat dalam peta yang tidak dapat diubah:

mutableMap.remove("USA"); assertFalse(unmodifiableMap.containsKey("USA")); mutableMap.put("Mexico", "North America"); assertTrue(unmodifiableMap.containsKey("Mexico"));

Peta Tidak Berubah, sebaliknya, mengandungi data peribadinya sendiri dan tidak membenarkan pengubahsuaiannya. Oleh itu, data tidak boleh berubah dengan cara apa pun setelah peta Peta tidak berubah dibuat.

3. Peta Jambu Batu yang Tidak Berubah

Jambu biji menyediakan versi tidak berubah dari setiap java.util . Petamenggunakan Peta Tidak Berubah . Ia membuang UnsupportedOperationException setiap kali kita cuba mengubahnya.

Oleh kerana ia mengandungi data peribadinya sendiri, data ini tidak akan berubah ketika peta asalnya diubah.

Kami sekarang akan membincangkan pelbagai cara membuat contoh Peta Tidak Berubah.

3.1. Menggunakan copyOf () Menghubungi

Pertama, mari kita gunakan kaedah ImmutableMap.copyOf () yang mengembalikan salinan semua entri seperti dalam peta asal:

ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); assertTrue(immutableMap.containsKey("USA"));

Ia tidak dapat diubah secara langsung atau tidak langsung:

assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); mutableMap.remove("USA"); assertTrue(immutableMap.containsKey("USA")); mutableMap.put("Mexico", "North America"); assertFalse(immutableMap.containsKey("Mexico"));

3.2. Menggunakan pembina () Menghubungi

Kita juga boleh menggunakan kaedah ImmutableMap.builder () untuk membuat salinan semua entri seperti dalam peta asal.

Lebih-lebih lagi, kita boleh menggunakan kaedah ini untuk menambahkan entri tambahan yang tidak terdapat dalam peta asal:

ImmutableMap immutableMap = ImmutableMap.builder() .putAll(mutableMap) .put("Costa Rica", "North America") .build(); assertTrue(immutableMap.containsKey("USA")); assertTrue(immutableMap.containsKey("Costa Rica"));

Sama seperti contoh sebelumnya, kita tidak dapat mengubahnya secara langsung atau tidak langsung:

assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); mutableMap.remove("USA"); assertTrue(immutableMap.containsKey("USA")); mutableMap.put("Mexico", "North America"); assertFalse(immutableMap.containsKey("Mexico"));

3.3. Menggunakan Kaedah ()

Akhirnya, kita dapat menggunakan kaedah ImmutableMap.of () untuk membuat peta yang tidak berubah dengan sekumpulan entri yang disediakan dengan cepat. Ia menyokong paling banyak lima pasangan kunci / nilai:

ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); assertTrue(immutableMap.containsKey("USA")); assertTrue(immutableMap.containsKey("Costa Rica"));

Kami juga tidak dapat mengubahnya:

assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));

4. Kesimpulan

Dalam artikel ringkas ini, kami membincangkan perbezaan antara Peta Tidak Boleh Diubah dan Peta Tidak Berubah.

Kami juga melihat pelbagai cara untuk membuat Guava's ImmutableMap.

Dan, seperti biasa, contoh kod lengkap boleh didapati di GitHub.