Tôi đang tạo một ứng dụng có chứa một lớp mà tôi đang viết là Người. Một trong các trường của Person là 'aliases' là một số ArrayList<String>
. Cuối cùng, các bí danh sẽ được hiển thị cho người dùng theo logic sau: Nếu Người có bí danh thì họ sẽ được hiển thị là [Finch, Wren, Admin, etc...]
, nếu không UNKNOWN
sẽ được hiển thị. Cho đến nay tôi đã cố gắng thực hiện điều này theo một trong ba cách sau:Cách xử lý giá trị mặc định của ArrayList
Person chứa các phương pháp
getAliases()
mà chỉ đơn giản trả về một bản sao của ArrayList như vậy. Người gọi sẽ kiểm tra một mảng trống để thực hiện hành vi mong muốn.Person chứa các phương pháp
aliasesToString()
mà có thể được gọi để tạo ra chuỗi mong muốn.Thay vì sử dụng
ArrayList<String>
, bí danh là triển khaiDefaultableArrayList<T>
. Lớp này mở rộng ArrayList và giữ một giá trị mặc định với kiểu T. Phương thứctoString()
được ghi đè để tạo chuỗi mong muốn. Ứng dụng gọisome_person.getAliases().toString()
để tạo ra hành vi mong muốn.
Dưới đây là thực hiện của tôi lựa chọn 3:
public class DefaultableArrayList<T> extends ArrayList<T> {
private static final long serialVersionUID = -6735356930885363889L; // Auto-generated
private final T defaultElement;
public DefaultableArrayList(T defaultElement) {
super();
this.defaultElement = defaultElement;
}
public DefaultableArrayList(Collection<? extends T> c, T defaultElement) {
super(c);
this.defaultElement = defaultElement;
}
public DefaultableArrayList(int initialCapacity, T defaultElement) {
super(initialCapacity);
this.defaultElement = defaultElement;
}
public T getDefaultElement() {
return defaultElement;
}
@Override
public String toString() {
if (!isEmpty()) {
return super.toString();
} else {
return defaultElement.toString();
}
}
}
gì tôi quan tâm về các lựa chọn 2 và 3 là tôi có thể thêm phức tạp không cần thiết trong khi vi phạm nguyên tắc OOP. Người nên thực sự quan tâm đến những gì sẽ xảy ra nếu không có bí danh và có ý nghĩa đối với các bí danh để xác định cách nó được triển khai cuối cùng trong ứng dụng không? Tôi nghĩ rằng tôi nên để người gọi xử lý trường hợp trống. Tôi nên chọn tuỳ chọn nào phù hợp nhất với hướng dẫn thiết kế OOP tiêu chuẩn? Hoặc là có một lựa chọn thứ tư mà tôi đã không xem xét?
Tôi muốn quay lại chế độ xem không thể thay đổi: 'Collections.unmodifiableList (bí danh)'. –
@JBNizet 'Collections.unmodifiableList (bí danh)' là một lựa chọn tốt. Nó bảo vệ thành viên ban đầu của cá thể khỏi bị sửa đổi và làm cho nó rõ ràng với người gọi phương thức mà họ không thể thay đổi cá thể Person bằng cách thay đổi danh sách các bí danh. – Eran
Có tất nhiên, xin lỗi tôi không có ý ám chỉ tôi sẽ trả lại một tài liệu tham khảo trực tiếp. Đó là một sự giám sát. – Helios