Immutable là gì? Sự khác nhau giữa Immutable với Mutable
Bài viết được sự cho phép của tác giả Trần Hữu Cương
1. Immutable là gì? Sự khác nhau giữa Immutable với mutable.
Immutable hiểu nôm na là không thể thay đổi còn mutable là có thể thay đổi. hai khái niệm Immutable và mutable thường được dùng class, object (Immutable đôi khi còn dùng với Collection nhưng mình sẽ không để cập ở bài này).
Ví dụ: Trong Java String là Immutable còn StringBuffer và StringBuilder là mutable.
1 Class/Đối tượng được coi là immutable nếu các thuộc tính của nó không bao giờ bị thay đổi và chỉ có thể thiết lập lúc khởi tạo.
- Ví dụ Immutable với String
// Khởi tạo str1 = "first" String str1 = new String("first"); // Khởi tạo str2 tham chiếu tới str1 String str2 = str1; // String là immutable, bất kì thao tác nào trên String đều tạo ra 1 đối tượng mới // str1.concat("-second") sẽ trả về 1 đối tượng String mới có giá trị là "first-second" str1 = str1.concat("-second"); System.out.println("str1: "+str1); System.out.println("str2: "+str2);
Kết quả
str1: first-second str2: first
- Ví dụ Mutable với StringBuffer
// Khởi tạo str1 = "first" StringBuffer str1 = new StringBuffer("first"); // Khởi tạo str2 tham chiếu tới str1 StringBuffer str2 = str1; // StringBuffer là mutable, do đó khi append thì giá trị của nó sẽ thay đổi trên chính vùng nhớ ban dầu str1.append("-second"); System.out.println("str1: "+str1); System.out.println("str2: "+str2);
Kết quả:
str1: first-second str2: first-second
Tham khảo việc làm NodeJS hấp dẫn trên TopDev
2. Tại sao lại dùng Immutable
Giống như ví dụ với String bên trên, ta thấy được sử dụng immutable sẽ tránh được sự thay đổi lẫn nhau khi đa tham chiếu (str1 và str2 cùng tham chiếu tới 1 vùng nhớ nhưng khi str1 thay đổi thì str2 sẽ không thay đổi)
- Thread Safe: Khi sử dụng immutable object ta sẽ không cần phải lo tới việc nhiều thread cùng làm thay đổi giá trị của 1 object
- Sử dụng các immutable object làm tham số của method sẽ không sợ nó bị thay đổi sau khi method kết thúc
- Sử dụng immutable object để làm key trong HashMap hoặc đẩy vào HashTable mà không gặp vấn đề gì khi lấy ra.
3. Cách tạo 1 Class Immutable
- Phải là final class (không thể thừa kế bởi class khác)
- Các field phải là private final
- Không có các method làm thay đổi trạng thái của các field (Ví dụ: chỉ có hàm get, không có các hàm set)
- Nếu có field nào là Object thì field đó cũng phải là 1 immutable Object hoặc khi khởi tạo/lấy ra field đó ta phải clone ra 1 bản khác.
Bài viết gốc được đăng tải tại stackjava.com
Có thể bạn quan tâm:
- Mechanical Sympathy Là Gì? Lập Trình BackEnd bằng Java
- Fuzzy search là gì? Những điều cần biết về thuật toán fuzzy
- Một số nguyên tắc, định luật trong lập trình
Tìm việc làm IT mới nhất tại TopDev ngay!
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- F Framework nào tốt nhất cho dự án của bạn? – Checklist chi tiết
- K Kinh nghiệm xử lý responsive table hiệu quả
- S Stackoverflow là gì? Bí kíp tận dụng Stack Overflow hiệu quả
- 7 7 kinh nghiệm hữu ích khi làm việc với GIT trong dự án
- B Bài tập Python từ cơ bản đến nâng cao (có lời giải)
- B Bảo mật API là gì? Một số nguyên tắc và kỹ thuật cần biết
- H Hướng dẫn cài đặt và tự học lập trình Python cơ bản từ A-Z
- C Chinh Phục Phân Tích Dữ Liệu Với Pandas Trong Python: Hướng Dẫn Từng Bước
- D Display CSS là gì? Cách khai báo và sử dụng thuộc tính display trong CSS