Vì vậy, tôi đã đọc một số Hiệu quả Java! Và một trong những phần đầy cảm hứng nhất của cuốn sách là phần Object/Builder bất biến, nơi Bloch viết về "Builder" - class thay vì chỉ POJOs.Thiết kế đối tượng mô hình Java
LƯU Ý: Tôi đang nói về các đối tượng mô hình ở đây: ví dụ: Điều hoặc Xe.
Đây là cách tôi đã viết các đối tượng này trước đây:
public class Car {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Bây giờ như bạn thấy thiết kế này là thiếu ở một số phương diện, nó đòi hỏi mutability và bạn phải xây dựng các đối tượng với lần đầu tiên các nhà xây dựng sau đó thiết lập tên. Bây giờ tất nhiên bạn có thể thực hiện trường cuối cùng name
và sử dụng nó làm đối số trong hàm dựng nhưng sau đó nếu bạn có một đối tượng lớn bao bọc một số lượng SQL - Bảng thì bạn sẽ có một hàm tạo xấu xí như sau:
public Car(int horsepowers, String name, String brand, int yearManufactured,
User owner, List<User> previousOwners) {
//Set the values
}
Điều này trở nên không thể đọc được khi tạo đối tượng và đây chỉ là sáu trường!
Vì vậy, Bloch gợi ý như sau (với tính bất biến)
public class Car {
public static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public Car build() {
reeturn new Car(this);
}
}
private final String name;
private Car(Builder builder) {
name = builder.name;
}
public String getName() {
return name;
}
}
//Construction example
Car car = new Car.Builder().setName("Speedy").build();
Bây giờ điều này cho chúng ta không thay đổi! Và nếu bạn có một số đối tượng không có tính nguyên thủy hoặc không thay đổi, chỉ cần sao chép chúng trong các bộ định dạng của Builder
và sao chép chúng một lần nữa trong các getters của Car
.
Nhưng nó rất dài dòng và tôi đã sử dụng các đối số hàm tạo nếu lớp đó đủ nhỏ. Nếu một lớp cần một trường có thể thay đổi, tôi chỉ làm cho trường đó có thể thay đổi, nếu lớp đó có đủ thuộc tính (> 4 cái gì đó).
Một vấn đề khác là khi làm việc với Android và lớp học có ví dụ Bitmap
, thì bạn phải trả về bitmap thực và không sao chép nó vì điều đó khá hiệu quả - tốn kém.
Tôi đã thấy hàng loạt câu hỏi như thế này nhưng tôi dường như không tìm được câu trả lời hay cho câu hỏi này: có bất kỳ tiêu chuẩn nào về thiết kế này không và thiết kế của chúng như thế nào? Những lợi ích/sự lừa dối là gì?
Cảm ơn trước!
EDIT:
Câu hỏi đặt ra là:
các tốt nhất cách để xây dựng một mô hình đối tượng cần được bất biến và với A) một số ít các lĩnh vực và B) lớn là gì số trường? Làm thế nào để xử lý vấn đề Bitmap
được đề cập ở trên và các vấn đề tương tự? Làm cho một số trường nhất định có thể thay đổi được?
Xin lỗi vì đã mơ hồ.
tôi nghĩ rằng điểm của 'Builder' là khi bạn đang đối phó với bất biến đối tượng với một số trường bắt buộc và tùy chọn. Vì bạn sẽ khai báo các trường là 'final'. Vì vậy, nó không áp dụng cho mọi thiết kế. – Sam