×

Sử dụng bộ sưu tập bất biến và không thay đổi trong Java

Java là một ngôn ngữ lập trình phổ biến, được sử dụng rộng rãi trong phát triển phần mềm. Trong Java, việc sử dụng các bộ sưu tập (collections) là rất quan trọng để quản lý dữ liệu. Tuy nhiên, đôi khi, chúng ta cần các bộ sưu tập mà không thể thay đổi sau khi được khởi tạo để đảm bảo tính toàn vẹn của dữ liệu. Đó chính là khi các bộ sưu tập bất biến và không thay đổi trở nên cực kỳ hữu ích.

Tại sao lại cần bộ sưu tập bất biến

  1. Tăng cường an toàn trong lập trình đa luồng: Khi làm việc với lập trình đa luồng, việc đảm bảo rằng dữ liệu sẽ không bị thay đổi bởi các luồng khác là rất quan trọng. Các bộ sưu tập bất biến giúp tránh các vấn đề liên quan đến đồng bộ hoá (synchronization).

  2. Dễ dàng trong việc chia sẻ dữ liệu giữa các thành phần: Khi biết rằng một bộ sưu tập là bất biến, chúng ta có thể dễ dàng chia sẻ bộ sưu tập đó giữa các lớp hay các phương thức mà không lo lắng về việc dữ liệu bị thay đổi.

  3. Bảo vệ tính toàn vẹn của dữ liệu: Đôi khi chúng ta có các dữ liệu mà không muốn ai thay đổi, ví dụ như cấu hình của hệ thống. Sử dụng bộ sưu tập bất biến giúp bảo vệ các dữ liệu này.

Cách tạo bộ sưu tập bất biến

Java Collections Framework

Trong Java Collections Framework, kể từ Java 9, chúng ta có thể dễ dàng tạo các bộ sưu tập bất biến bằng cách sử dụng các phương thức của List, Set, Map như List.of(), Set.of(), và Map.of().

List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B", "C");
Map<String, String> map = Map.of("key1", "value1", "key2", "value2");

Các bộ sưu tập được tạo ra từ các phương thức này là bất biến và không thay đổi.

Collections.unmodifiableXXX

Một phương pháp khác để tạo bộ sưu tập bất biến là sử dụng các phương thức Collections.unmodifiableList(), Collections.unmodifiableSet(), và Collections.unmodifiableMap().

List<String> mutableList = new ArrayList<>(List.of("A", "B", "C"));
List<String> immutableList = Collections.unmodifiableList(mutableList);

Set<String> mutableSet = new HashSet<>(Set.of("A", "B", "C"));
Set<String> immutableSet = Collections.unmodifiableSet(mutableSet);

Map<String, String> mutableMap = new HashMap<>(Map.of("key1", "value1", "key2", "value2"));
Map<String, String> immutableMap = Collections.unmodifiableMap(mutableMap);

Mặc dù bộ sưu tập gốc có thể thay đổi, nhưng các bộ sưu tập bất biến được tạo ra sẽ không thể thay đổi.

Immutable Collection từ thư viện ngoài

Một cách khác là sử dụng các thư viện bên ngoài như Guava. Guava là một thư viện phổ biến do Google phát triển, cung cấp các bộ sưu tập bất biến dễ dàng tạo ra.

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableMap;

ImmutableList<String> guavaList = ImmutableList.of("A", "B", "C");
ImmutableSet<String> guavaSet = ImmutableSet.of("A", "B", "C");
ImmutableMap<String, String> guavaMap = ImmutableMap.of("key1", "value1", "key2", "value2");

Kết luận

Các bộ sưu tập bất biến và không thay đổi trong Java cung cấp rất nhiều lợi ích, đặc biệt là trong việc tăng cường an toàn trong lập trình đa luồng, dễ dàng chia sẻ dữ liệu và bảo vệ tính toàn vẹn của dữ liệu. Từ Java 9, việc tạo ra các bộ sưu tập bất biến trở nên dễ dàng hơn bao giờ hết với các phương thức tiện ích được cung cấp. Các thư viện ngoài như Guava cũng mang đến nhiều lựa chọn linh hoạt và hiệu quả trong việc quản lý bộ sưu tập bất biến.

Comments