Set Tidak Berubah di Jawa

1. Pengenalan

Dalam tutorial ini, kita akan melihat pelbagai cara untuk membina satu set yang tidak berubah di Java.

Tetapi pertama-tama, mari kita fahami set yang tidak berubah dan lihat mengapa kita memerlukannya.

2. Apakah Set yang Tidak Berubah?

Secara umum, objek yang tidak dapat diubah tidak akan mengubah keadaan dalamannya setelah kita membuatnya. Ini menjadikannya selamat untuk utas secara lalai. Logik yang sama berlaku untuk set yang tidak berubah.

Anggaplah kita mempunyai instance HashSet dengan beberapa nilai. Menjadikannya tidak berubah akan membuat versi "hanya baca" dari set kami. Oleh itu, sebarang percubaan untuk mengubah keadaannya akan menjadikan UnsupportedOperationException .

Jadi, mengapa kita memerlukannya?

Sudah tentu, kes penggunaan yang paling biasa dari set yang tidak berubah adalah persekitaran pelbagai utas. Oleh itu, kami dapat berkongsi data yang tidak berubah di semua utas tanpa perlu risau tentang penyegerakannya.

Sementara itu, ada perkara penting yang perlu diingat: kebolehubahan hanya berkaitan dengan set dan bukan elemennya . Selanjutnya, kita dapat mengubah rujukan contoh elemen set tanpa masalah.

3. Buat Set Tidak Berubah di Java Core

Dengan hanya kelas inti Java yang dapat kita gunakan, kita dapat menggunakan Koleksi . kaedah unmodifiableSet () untuk membungkus Set asal .

Pertama, mari buat instance HashSet ringkas dan mulakan dengan nilai String :

Set set = new HashSet(); set.add("Canada"); set.add("USA");

Seterusnya, mari kita selesaikan dengan Koleksi . tidak boleh diubah set ():

Set unmodifiableSet = Collections.unmodifiableSet(set);

Akhirnya, untuk memastikan contoh Set yang tidak dapat diubah suai tidak berubah, mari buat kes ujian mudah:

@Test(expected = UnsupportedOperationException.class) public void testUnmodifiableSet() { // create and initialize the set instance Set unmodifiableSet = Collections.unmodifiableSet(set); unmodifiableSet.add("Costa Rica"); }

Seperti yang kita jangkakan, ujian akan berjalan dengan jayanya. Tambahan pula, operasi tambah () dilarang pada contoh yang tidak dapat diubah suai dan akan membuang UnsupportedOperationException .

Sekarang, mari kita ubah contoh set awal dengan menambahkan nilai yang sama padanya:

set.add("Costa Rica");

Dengan cara ini, kita secara tidak langsung mengubah set yang tidak dapat diubah suai. Oleh itu, apabila kita mencetak contoh yang tidak dapat diubah :

[Canada, USA, Costa Rica]

Seperti yang kita lihat, item "Kosta Rika" juga terdapat di Set yang tidak dapat diubah.

4. Buat Set Tidak Berubah di Java 9

Sejak Java 9, kaedah kilang statik Set.of (elemen) tersedia untuk membuat set tidak berubah:

Set immutable = Set.of("Canada", "USA");

5. Buat Set Tidak Berubah di Jambu Batu

Cara lain untuk membina set yang tidak berubah adalah dengan menggunakan kelas ImmutableSet Guava . Ia menyalin data yang ada ke dalam contoh baru yang tidak berubah. Akibatnya, data di dalam ImmutableSet tidak akan berubah ketika kita mengubah Set yang asli .

Seperti implementasi Java inti, setiap percubaan untuk mengubah contoh tidak berubah yang dibuat akan membuang UnsupportedOperationException .

Sekarang, mari kita terokai pelbagai cara untuk membuat kejadian tidak berubah.

5.1. Menggunakan ImmutableSet. copyOf ()

Ringkasnya, ImmutableSet . kaedah copyOf () mengembalikan salinan semua elemen dalam set:

Set immutable = ImmutableSet.copyOf(set);

Jadi, setelah menukar set awal, contoh yang tidak berubah akan tetap sama:

[Canada, USA]

5.2. Menggunakan ImmutableSet .of ()

Begitu juga, dengan kaedah ImmutableSet.of () kita dapat membuat set tidak berubah dengan nilai yang diberikan:

Set immutable = ImmutableSet.of("Canada", "USA");

Apabila kita tidak menentukan unsur apa pun, ImmutableSet.of () akan mengembalikan set yang tidak berubah.

Ini dapat dibandingkan dengan Java 9's Set .of ().

6. Kesimpulannya

Dalam artikel ringkas ini, kami membincangkan Set yang tidak berubah dalam bahasa Java. Selain itu, kami menunjukkan cara membuat Set yang tidak berubah menggunakan API Koleksi dari inti Java, Java 9 dan perpustakaan Jambu.

Akhirnya, seperti biasa, kod lengkap untuk artikel ini terdapat di GitHub.