Immutable ArrayList trong Java

Trong bài hướng dẫn nhanh này chúng ta sẽ cùng nhau tìm cách làm thế nào để tạo ra một immutable ArrayList trong Java với thư viện chuẩn của JDK hoặc các thư viện được bên thứ ba như Guava và Apache Commons Collections 4.

JDK core

Đầu tiên, chúng ta có thể tạo ta một immutable ArrayList với Collections được cung cấp sẵn từ JDK core.

Collections.unmodifiableList(list);

Collection mới được tạo từ method này sẽ không thể được chỉnh sửa nếu không một exception sẽ được ném ra.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
        List<String> unmodifiableList = Collections.unmodifiableList(list);
        unmodifiableList.add("four");
    }
}

Output

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1057)
	at Main.main(Main.java:10)

Hoặc nếu bạn đang sử dụng Java 9 trở lên thì có thể sử dụng List<E>.of(… elements) method để tạo ra immutable list.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
        final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
        unmodifiableList.add("four");
    }
}

Guava

Guava cũng cung cấp method tương tự như trên thông qua method

ImmutableList.copyOf(list);

Nhưng trước tiên hãy thêm dependency của nó đã nhé.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.6.1-jre</version>
</dependency>

Tương tự, List trả về không thể được chỉnh sửa.

import com.google.common.collect.ImmutableList;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
        List<String> unmodifiableList = ImmutableList.copyOf(list);
        unmodifiableList.add("four");
    }
}

Output

Exception in thread "main" java.lang.UnsupportedOperationException
	at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:225)
	at Main.main(Main.java:11)

Apache Collections Commons

Ngoài cung cấp các tính năng tiện lợi hỗ trợ để thao tác trên các collection thì Apache commons cũng cung hỗ trợ chúng ta tạo ra một ImmutableCollection.

Trước tiên để sử dụng chúng ta cần thêm dependency nó vào project maven.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

Đoạn code sau vẫn sẽ gây ra exception khi chúng ta cố gắng chỉnh sửa một immutable list.

import org.apache.commons.collections4.ListUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
        List<String> unmodifiableList = ListUtils.unmodifiableList(list);
        unmodifiableList.add("four");
    }
}

Kết bài

Như vậy chúng ta đã tìm hiểu được cách tạo ra một immutable list trong Java thông qua nhiều cách. Trong immutable có ý nghĩa rất lớn nếu bạn không muốn dữ liệu trong List của mình bị thay đổi bởi những nơi khác.

Nguồn

https://www.baeldung.com/java-immutable-list

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x