Dường như bạn đang hiểu sai văn bản.
Bây giờ tôi có thể đồng ý với người cuối cùng, nhưng trong JavaBeans mắt tôi trong một danh sách có ý nghĩa rất nhiều hơn Maps lồng nhau
Các văn bản không bao giờ đề cập đến bản đồ lồng nhau như một sự thay thế (yiack)
... nên gọi nhà thầu, không được thiết lập * phương pháp, và đối tượng nên không thể thay đổi
Đây là một thực hành tốt, đặc biệt hữu ích khi xử lý các chuỗi.
Nhưng chúng tôi không thể nói rằng sử dụng các bộ định vị là baaad một trong hai, đặc biệt khi một sợi đơn đang sử dụng đối tượng. Điều đó hoàn toàn an toàn.
Tôi không muốn tạo đối tượng mới mỗi khi có thông tin mới, tôi muốn thêm nó vào một thông tin hiện có.
Tốt thôi, miễn là bạn kiểm soát đối tượng không có vấn đề gì với điều này, một số khác có thể dễ dàng hơn khi tạo đối tượng mới.
Bạn đang sử dụng JavaBeans để lưu trữ dữ liệu không tốt và nên tránh hoặc hoàn toàn an toàn?
Không, không phải là hành vi không tốt. Không phải là hoàn toàn an toàn. Tùy theo hoàn cảnh.
Sự cố với các đối tượng có thể thay đổi (không phải với JavaBeans per se) đang sử dụng các chuỗi khác nhau để truy cập chúng.
Bạn phải đồng bộ hóa quyền truy cập để tránh một chủ đề sửa đổi đối tượng trong khi người khác đang truy cập đối tượng đó.
Đối tượng không thể thay đổi không có vấn đề này, bởi vì, .. họ không thể thay đổi, và do đó, bạn không phải đồng bộ hóa bất kỳ thứ gì.
Để đảm bảo đối tượng không thay đổi, bạn phải khai báo thuộc tính của mình là cuối cùng.
class MyBean {
private final int i;
}
Nếu bạn muốn gán một giá trị hợp lý để MyBean.i
bạn phải xác định nó trong constructor:
public MyBean(int i) {
this.i = i;
}
Kể từ khi biến là cuối cùng, bạn không thể sử dụng một setter. Bạn chỉ có thể cung cấp một getter.
Điều này hoàn toàn an toàn cho luồng và tốt nhất là bạn không phải đồng bộ hóa quyền truy cập, bởi vì nếu hai chủ đề cố gắng lấy giá trị i
cả hai đều sẽ luôn thấy giá trị được gán trên instantiation, bạn không phải đồng bộ hóa bất cứ điều gì.
Hành nghề không tốt hoặc thực hành tốt.Phải của chúng tôi phải làm việc với một chủ đề duy nhất, ngay cả trong môi trường đa luồng như servlet.
Nếu trong tương lai bạn phải đối phó với các ứng dụng đa luồng, bạn có thể xem xét sử dụng một JavaBean bất biến;)
BTW, giải pháp thay thế để tạo ra đậu bất biến, và vẫn cung cấp một loạt các setters đang sử dụng Builders
như :
Employee e = new EmployeeBuilder()
.setName("Oscar")
.setLastName("Reyes")
.setAge(0x1F)
.setEmployeeId("123forme")
.build();
Có vẻ khá giống với setXyz thông thường được sử dụng trong hạt thông thường với lợi ích của việc sử dụng dữ liệu không thay đổi.
Nếu bạn cần thay đổi một giá trị, bạn có thể sử dụng một phương pháp học:
Employee e = Employee.withName(e, "Mr. Oscar");
nào có đối tượng đang tồn tại, và sao chép tất cả các giá trị, và thiết lập một cái mới ....
public static EmployeeWithName(Employee e , String newName){
return new Employee(newName, e.lastName, e.age, e.employeeId);
}
Nhưng một lần nữa, trong một mô hình chuỗi đơn lẻ là hoàn toàn an toàn để sử dụng getters/setters.
PS Tôi thực sự khuyên bạn nên mua cuốn sách này: Effective Java. Bạn sẽ không bao giờ hối tiếc về nó, và bạn sẽ có thông tin để đánh giá các bài viết tốt hơn như một trích dẫn.
JavaBeans không đại diện cho mô hình như một ngôn ngữ chống mẫu toàn bộ. –
bạn có thể sử dụng một người xây dựng để đạt được những lợi ích của bất biến và tránh các nhà xây dựng siêu dài. –
Xem xét việc tìm hiểu về Mẫu Builder. http://en.wikipedia.org/wiki/Builder_pattern. – CoolBeans