Immutable là gì? Sự khác nhau giữa Immutable với Mutable

2903

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

Immutable với String

  Bí quyết sử dụng "Immutability" để code gọn và sạch hơn

  Giới thiệu về Spring Integration

// 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

Immutable với String

// 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:

Tìm việc làm IT mới nhất tại TopDev ngay!