Lớp immutable (không thay đổi)
Lớp Immutable là một lớp mà các đối tượng của nó không thể bị thay đổi sau khi được khởi tạo. Điều này có nghĩa là trạng thái của một đối tượng Immutable sẽ luôn được giữ nguyên trong suốt vòng đời của nó.
Tại sao lại sử dụng lớp Immutable?
↳ Lớp MatcherAn toàn luồng: Vì trạng thái không thay đổi nên các đối tượng Immutable có thể được chia sẻ giữa nhiều luồng mà không cần lo lắng về các vấn đề đồng bộ hóa.
↳ Lớp PatternDễ dự đoán: Trạng thái của một đối tượng Immutable luôn được đảm bảo, giúp cho việc lập trình trở nên dễ dàng hơn và giảm thiểu lỗi.
↳ Phù hợp cho các cấu trúc dữ liệu: Các đối tượng Immutable thường được sử dụng làm key trong các cấu trúc dữ liệu như HashMap vì chúng đảm bảo tính nhất quán.
Các bước để tạo một lớp Immutable
↳ Khai báo tất cả các trường thành private và final: Điều này đảm bảo rằng giá trị của các trường không thể bị thay đổi sau khi khởi tạo.
↳ Không cung cấp các phương thức setter: Việc này ngăn chặn việc thay đổi giá trị của các trường từ bên ngoài.
↳ Tạo một constructor để khởi tạo tất cả các trường: Constructor sẽ được gọi chỉ một lần khi tạo đối tượng và sau đó không thể thay đổi.
↳ Nếu các trường là các đối tượng tham chiếu, hãy tạo bản sao sâu (deep copy) để tránh các thay đổi không mong muốn: Deep copy sẽ tạo ra một bản sao hoàn toàn mới của đối tượng, đảm bảo rằng các thay đổi đối với bản sao không ảnh hưởng đến đối tượng gốc.
↳ Làm cho lớp là final: Điều này ngăn chặn việc tạo các lớp con có thể override các phương thức và thay đổi hành vi của lớp.
Dưới đây là một ví dụ về một lớp immutable:
Ví dụ: Example.java
public final class ImmutablePerson {
private final String name;
private final int age;
// Constructor để khởi tạo các trường
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
// Phương thức getter để truy cập giá trị
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Không cung cấp phương thức setter để thay đổi giá trị
// Các phương thức khác (nếu cần)
}
Lớp ở trên bất biến vì
↳ final Class: Lớp Person không thể bị kế thừa.
↳ private final Fields: Các trường name và age không thể thay đổi sau khi khởi tạo.
↳ Constructor: Các trường được khởi tạo trong constructor và không có phương thức setter.
↳ Getters: Các phương thức getter cung cấp quyền truy cập các giá trị nhưng không thay đổi chúng.
Lớp Immutable là một công cụ hữu ích trong lập trình Java, đặc biệt khi bạn muốn đảm bảo tính an toàn, đáng tin cậy và dễ bảo trì của code. Bằng cách hiểu rõ các nguyên tắc tạo lớp Immutable, bạn có thể viết ra những đoạn code chất lượng cao và hiệu quả.