Tôi rất tò mò về khả năng cung cấp bất biến cho đậu java (bằng đậu ở đây tôi có nghĩa là các lớp học với một hàm tạo rỗng cung cấp getters và setters cho các thành viên). Rõ ràng các lớp này không phải là bất biến và nơi chúng được sử dụng để vận chuyển các giá trị từ lớp dữ liệu, điều này có vẻ như là một vấn đề thực sự.Đậu bất biến trong Java
Một cách tiếp cận cho vấn đề này đã được đề cập ở đây trong StackOverflow được gọi là "Mẫu đối tượng không thể thay đổi trong C#", nơi đối tượng bị đóng băng khi được xây dựng hoàn chỉnh. Tôi có một cách tiếp cận khác và thực sự muốn nghe ý kiến của mọi người về nó.
Mẫu liên quan đến hai lớp không thay đổi và có thể thay đổi khi cả hai có thể thay đổi và không thay đổi cả hai đều triển khai một giao diện cung cấp các phương thức đậu không biến đổi.
Ví dụ
public interface DateBean {
public Date getDate();
public DateBean getImmutableInstance();
public DateBean getMutableInstance();
}
public class ImmutableDate implements DateBean {
private Date date;
ImmutableDate(Date date) {
this.date = new Date(date.getTime());
}
public Date getDate() {
return new Date(date.getTime());
}
public DateBean getImmutableInstance() {
return this;
}
public DateBean getMutableInstance() {
MutableDate dateBean = new MutableDate();
dateBean.setDate(getDate());
return dateBean;
}
}
public class MutableDate implements DateBean {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public DateBean getImmutableInstance() {
return new ImmutableDate(this.date);
}
public DateBean getMutableInstance() {
MutableDate dateBean = new MutableDate();
dateBean.setDate(getDate());
return dateBean;
}
}
Cách tiếp cận này cho phép đậu được xây dựng sử dụng phản chiếu (bằng các công ước thông thường) và cũng cho phép chúng ta chuyển đổi sang một phiên bản bất biến vào dịp gần nhất. Thật không may là rõ ràng là một số lượng lớn boilerplate cho mỗi đậu.
Tôi rất muốn nghe cách tiếp cận của người khác đối với vấn đề này. (Lời xin lỗi của tôi vì đã không cung cấp một câu hỏi hay, có thể được trả lời chứ không phải là thảo luận :)
Đó là một ý tưởng rất hay. Điều đó phù hợp với vấn đề rất thanh lịch. Chúc mừng Chris. –
Nếu đó là một đối tượng ngày được tổ chức trong DateBean, bạn sẽ phải tạo một ngày mới trên get. Nếu không, bạn có thể sửa đổi ngày qua ImmutableDate.getDate(). Set .... – monksy