ArrayList yang tidak berubah di Jawa

1. Gambaran keseluruhan

Tutorial ringkas ini akan menunjukkan cara membuat ArrayList tidak berubah dengan inti JDK, dengan Jambu dan akhirnya dengan Apache Commons Collections 4.

Artikel ini adalah sebahagian daripada siri " Java - Back to Basic " di Baeldung.

2. Dengan JDK

Pertama, JDK menyediakan cara yang baik untuk mendapatkan koleksi yang tidak dapat diubah daripada koleksi yang ada:

Collections.unmodifiableList(list);

Koleksi baru tidak boleh diubah pada masa ini:

@Test(expected = UnsupportedOperationException.class) public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = Collections.unmodifiableList(list); unmodifiableList.add("four"); }

2.1. Dengan Java 9

Sejak Java 9, kita dapat menggunakan kaedah kilang statik List.of (E… element) untuk membuat senarai yang tidak berubah:

@Test(expected = UnsupportedOperationException.class) public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() { final List list = new ArrayList(Arrays.asList("one", "two", "three")); final List unmodifiableList = List.of(list.toArray(new String[]{})); unmodifiableList.add("four"); }

Perhatikan bagaimana kita harus menukar senarai yang ada menjadi array. Ini kerana List.of (elemen) menerima parameter vararg.

3. Dengan Jambu Batu

Jambu batu menyediakan fungsi yang serupa untuk membuat versi ImmutableList sendiri :

ImmutableList.copyOf(list);

Begitu juga - senarai yang dihasilkan tidak boleh diubah suai:

@Test(expected = UnsupportedOperationException.class) public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = ImmutableList.copyOf(list); unmodifiableList.add("four"); }

Perhatikan bahawa operasi ini sebenarnya akan membuat salinan senarai asal , bukan hanya pandangan.

Jambu batu juga menyediakan pembina - ini akan mengembalikan ImmutableList yang ditaip kuat dan bukan hanya Senaraikan :

@Test(expected = UnsupportedOperationException.class) public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); ImmutableList unmodifiableList = ImmutableList.builder().addAll(list).build(); unmodifiableList.add("four"); }

4. Dengan Apache Collections Commons

Akhirnya, Commons Collection juga menyediakan API untuk membuat senarai yang tidak dapat diubah:

ListUtils.unmodifiableList(list);

Dan sekali lagi, mengubah senarai yang dihasilkan akan menghasilkan UnsupportedOperationException :

@Test(expected = UnsupportedOperationException.class) public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = ListUtils.unmodifiableList(list); unmodifiableList.add("four"); }

5. Kesimpulan

Tutorial ini menggambarkan cara membuat Senarai yang tidak dapat diubah dari ArrayList yang ada dengan menggunakan sama ada JDK teras, Koleksi Google Jambu atau Apache Commons.

Pelaksanaan semua contoh dan coretan kod ini dapat dilihat di Github - ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.