Dưới đây là sự hiểu biết của tôi từ một chút googling và tìm this article. Một đối tượng hiệu quả không thể thay đổi là một đối tượng có chứa các trường có thể bị đột biến, nhưng nó không cho phép bất cứ điều gì thay đổi các trường đó bởi vì nó không bao giờ cung cấp cho bạn một tham chiếu đến chúng. Ví dụ: giả sử bạn tạo một lớp với một số ArrayList
trong đó. ArrayList
s có thể thay đổi, nhưng nếu lớp của bạn luôn trả về một bản sao của ArrayList và mọi thứ khác trong lớp của bạn là không thay đổi, thì lớp của bạn đã trở thành hiệu quả không thay đổi: Không có cách nào để thay đổi trạng thái của một thể hiện của lớp.
Các bài viết trên blog cho đây là một ví dụ về một lớp học có hiệu quả bất biến:
import java.awt.*;
public class Line {
private final Point start;
private final Point end;
public Line(final Point start, final Point end) {
this.start = new Point(start);
this.end = new Point(end);
}
public void draw() {
//...
}
public Point getStart() {
return new Point(start);
}
public Point getEnd() {
return new Point(end);
}
}
Point
đối tượng là có thể thay đổi, nhưng đó là ok, vì lớp này không cung cấp cho tất cả mọi người tham khảo trực tiếp đến nó trường Point . Thay vào đó, nó trả về một cá thể mới có cùng giá trị trong nó. Bằng cách đó, không ai có thể biến đổi trạng thái của lớp Line
. Điều này làm cho lớp Line
có hiệu quả bất biến.
Vậy điều này khác với lớp thực sự bất biến như thế nào? Một lớp học thực sự bất biến có các lĩnh vực cũng không thay đổi. Hãy tưởng tượng Line
thực sự là bất biến. Để làm điều đó, chúng tôi cũng sẽ phải tưởng tượng rằng Point
là không thay đổi. Đưa ra những giả định, phương pháp getStart()
văn đều có thể được viết như thế này:
public Point getStart() {
return start;
}
Nguồn
2013-05-21 20:03:07
Xem [Làm các đối tượng không thay đổi có hiệu quả] (http://stackoverflow.com/questions/8707426/do-effectively-immutable-objects-make-sense) cũng đề cập đến cuốn sách mà bạn giới thiệu. – Bobulous
Xem thêm [Phải tất cả các thuộc tính của một đối tượng bất biến là cuối cùng?] (Http://stackoverflow.com/questions/16061030/must-all-properties-of-an-immutable-object-be-final) – assylias