Như chúng ta đã biết trong suốt quá trình phát triển và bảo trì phần mềm, việc đảm bảo tính an toàn và đáng tin cậy của dữ liệu là một trong những ưu tiên hàng đầu. Một trong những cách hiệu quả để đạt được mục tiêu này trong Java là sử dụng immutable class.
Trong bài viết này, chúng ta sẽ thảo luận về cách xây dựng và sử dụng immutable cùng theo đó là lợi ích và các trường hợp sử dụng phổ biến, bao gồm việc sử dụng final fields, deep copy, và các phương pháp bảo vệ dữ liệu khác.
Trước tiên, đi sơ về định nghĩa immutable và cụ thể là immutable object nhưng mọi người vẫn thường dùng
Immutable nghĩa là sau khi khởi tạo đối tượng thì giá trị của object ( state ) sẽ không bị thay đổi bằng bất kì hình thức nào.
Ví dụ: String trong java
Vậy với tính chất của nó thì sẽ đem lại tác dụng gì ?
-thread safety: bởi vì giá trí của immutable sẽ không bị thay đổi . Từ đó giúp tận dụng nó mà không cần phải synchornized hay lock trong môi trường đa luồng
-consistency: giá trị của immutable sẽ không bị thay đổi trong suốt vòng đời của đối tượng. Từ đó, lập trình viên có thể quản lý đối tượng dễ dàng hơn.
-security: tất nhiên immutable sẽ giúp nâng cao tính bảo mật cho ứng dụng r
-debugging: giúp cho việc debug dễ dàng hơn
⇒ Với các ứng dụng quan trọng như vậy thì immutable được dùng rất nhiều trong các ứng dụng khác nhau
-Vậy đi vào chủ đề chính thì immutable trong class khác gì ? Đúng rồi, nó tương tự như immutable object giúp ta đạt được tính bất biến.
- Khai báo class là final và các field thuộc tính là private final để đảm bảo không truy cập và sửa đổi được
- Không cung cấp setter method hay bất kì method nào khác mà làm thay đổi giá trị thuộc tính
- Sử dụng deep copy khi constructor
- Sủ dụng copy khi clone object thay vì trả ra trực tiếp
Lý thuyết vậy đủ rồi, cùng đi vào ví dụ nào bằng cách tạo 1 immutable class:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; public final class ImmutableClass { private final int num; private final HashMap<String, String> hashmap; public ImmutableClass(int num, HashMap<String,String> hashmap) { this.num = num; this.hashmap = new HashMap<String,String>(hashmap); } public int getNum() { return num; } //Collections.unmodifiableMap ⇒ create a copy of original map and make it read-only, if user try to modify it, throw UnSupportedOperationException public Map<String,String> getHashMap() { return Collections.unmodifiableMap(hashmap); } public static void main(String[] args) { HashMap<String, String> originalMap = new HashMap<>(); originalMap.put("key1", "value1"); originalMap.put("key2", "value2"); ImmutableClass immutableObject = new ImmutableClass(42, originalMap); // Trying to modify the originalMap originalMap.put("key3", "value3"); System.out.println(immutableObject.getHashMap()); // Trying to modify the returned hashMap Map<String, String> returnedMap = immutableObject.getHashMap(); returnedMap.put("key4", "value4"); // throw exception }
}
Ok hi vọng bài viết này giúp cho mọi người phần nào có cái nhìn sơ bộ về Immutable class và ứng dụng của nó trong dự án.
Nếu có góp ý gì thì mọi người cứ comment thoải mái mình sẽ cố gắng trả lời nếu có thể.
Nguồn tham khảo:
https://www.geeksforgeeks.org/create-immutable-class-java/
https://www.digitalocean.com/community/tutorials/how-to-create-immutable-class-in-java