Implementasi Peta yang Tidak Dapat Diubah di Jawa

1. Ikhtisar

Terkadang lebih baik untuk melarang modifikasi pada java.util.Map seperti berbagi data hanya-baca di seluruh utas. Untuk tujuan ini, kita dapat menggunakan Peta yang Tidak Dapat Dimodifikasi atau Peta yang Tidak Dapat Diubah.

Dalam tutorial singkat ini, kita akan melihat apa perbedaan di antara keduanya. Kemudian, kami akan menyajikan berbagai cara untuk membuat Peta Abadi.

2. Tidak dapat diubah vs Tidak dapat diubah

Peta yang Tidak Dapat Dimodifikasi hanyalah pembungkus di atas peta yang dapat dimodifikasi dan tidak mengizinkan modifikasi secara langsung:

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

Tapi peta yang bisa diubah yang mendasari masih bisa diubah dan modifikasinya juga tercermin di peta Unmodifiable:

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

Peta yang Tidak Dapat Diubah, di sisi lain, berisi data pribadinya sendiri dan tidak mengizinkan modifikasi padanya. Oleh karena itu, data tidak dapat berubah dengan cara apapun setelah sebuah instance dari Peta yang Tidak Dapat Diubah dibuat.

3. Peta Abadi Jambu Biji

Guava menyediakan versi yang tidak dapat diubah dari setiap java.util . Petamenggunakan ImmutableMap . Ini melontarkan UnsupportedOperationException setiap kali kami mencoba untuk memodifikasinya.

Karena berisi data pribadinya sendiri, data ini tidak akan berubah ketika peta asli diubah.

Sekarang kita akan membahas berbagai cara membuat instance dari ImmutableMap.

3.1. Menggunakan Metode copyOf ()

Pertama, mari gunakan metode ImmutableMap.copyOf () yang mengembalikan salinan semua entri seperti di peta asli:

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

Itu tidak dapat dimodifikasi 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 Metode builder ()

Kita juga bisa menggunakan metode ImmutableMap.builder () untuk membuat salinan semua entri seperti di peta asli.

Selain itu, kita dapat menggunakan metode ini untuk menambahkan entri tambahan yang tidak ada di peta asli:

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

Sama seperti pada contoh sebelumnya, kita tidak dapat memodifikasinya 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 Metode ()

Akhirnya, kita dapat menggunakan metode ImmutableMap.of () untuk membuat peta yang tidak dapat diubah dengan satu set entri yang disediakan dengan cepat. Ini mendukung 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 memodifikasinya:

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

4. Kesimpulan

Dalam artikel singkat ini, kita membahas perbedaan antara Peta yang Tidak Dapat Dimodifikasi dan Peta yang Tidak Dapat Diubah.

Kami juga telah melihat berbagai cara untuk membuat Peta Abadi Guava .

Dan, seperti biasa, contoh kode lengkap tersedia di GitHub.