Tại sao không sử dụng phương pháp # 2
ví dụ thứ hai của bạn là không nên vì nếu bạn bổ sung thêm một lĩnh vực mới để lớp Address, sau đó làm bạn thêm nó vào phương pháp setter hiện tại hoặc để bạn tạo một phương pháp setter mới? Nếu bạn thêm nó vào phương thức setter hiện có, thì bất kỳ lớp nào được gọi là phương thức đó sẽ bị hỏng.Và nếu bạn đã tạo một phương thức setter mới, thì nó sẽ gây nhầm lẫn cho bất kỳ ai muốn sử dụng lớp đó tại sao một số trường nhất định được nhóm lại với nhau theo cách đó trong khi những trường khác thì không.
Sử dụng một phương pháp setter riêng biệt cho từng lĩnh vực mà bạn muốn để lộ
Các thực tế phổ biến là phải có một phương pháp setter duy nhất cho mỗi trường trong lớp học của bạn mà bạn muốn để lộ (tức là ví dụ đầu tiên của bạn) . Có hay không đây là một thực hành tốt là gây tranh cãi bởi vì nó buộc một lớp là mutable. Tốt nhất là làm cho một đối tượng bất biến, nếu có thể, for a number of reasons.
Khởi tạo các lĩnh vực của bạn sử dụng một constructor
Một cách để làm cho một lớp học bất biến là bằng cách loại bỏ các phương pháp setter và thay vào đó đưa ra các lĩnh vực của bạn settable qua constructor lớp học của bạn, như dưới đây. Nhược điểm để thực hiện nó theo cách này là nếu lớp của bạn có nhiều trường, nó có khả năng dẫn đến các cuộc gọi hàm tạo lớn, không đọc được.
public class Address {
public String name;
public String city;
private Address(String name, String city) {
this.name = name;
this.city = city;
}
}
Khởi tạo các lĩnh vực của bạn bằng cách sử dụng mẫu Builder
Dưới đây là một việc thực hiện hoàn toàn thay thế (lấy cảm hứng từ this article) mà là một biến thể của mô hình Builder. Nó mô phỏng sự biến đổi đối tượng mà không bị mất khả năng đọc.
public class Address {
public String name;
public String city;
private Address() {}
private void setName(String name) {
this.name = name;
}
private void setCity(String city) {
this.city = city;
}
static class Builder {
private Address address = new Address();
public Builder name(String name) {
address.setName(name);
return this;
}
public Builder city(String city) {
address.setCity(city);
return this;
}
public Address build() {
return address;
}
}
}
Với lớp trên, bạn có thể tạo ra một thể hiện bất biến của lớp Địa chỉ như sau:
Address address = new Address.Builder()
.name("Mansoor's address")
.city("Toronto")
.build();
cách tiếp cận nào sử dụng bộ nhớ nhiều hơn?
Từ điểm bộ nhớ, sẽ không có bất kỳ sự khác biệt nào do kích thước của một lớp trong bộ nhớ phụ thuộc vào các trường trong lớp. Vì cả ba cách triển khai đều có cùng các trường nên chúng sẽ lấy cùng một lượng không gian trong bộ nhớ, bất kể bạn sử dụng phương pháp nào.
Hiển thị cho chúng tôi ý nghĩa của bạn với các mẫu mã cho cả hai cách tiếp cận. –
mục đích của lớp học này là gì? nó là một đối tượng giá trị? bạn sẽ yêu cầu đặt từng giá trị một cách độc lập? Những giá trị này có thay đổi sau khi tạo đối tượng không? Bạn có ý nghĩa gì bởi "điểm nhìn của bộ nhớ"? Bộ nhớ của con người hoặc bộ nhớ máy tính? – buritos
Ví dụ thứ nhất là tốt, ví dụ thứ 2 là xấu. Sử dụng một hàm tạo. – BalusC