Tôi có một lớp java trừu tượng "BaseOperation". Lớp này chỉ có một phương thức trừu tượng duy nhất:Một phương thức java có cả kiểu trả về biến và các đối số đầu vào biến đổi
public abstract T execute()
{
...
return T;
}
lớp con của BaseOperation phải thực hiện phương pháp này:
public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
...
@Override
public GetUsersResponse execute()
{
...
return GetUsersResponse;
}
}
Đây là một cách tuyệt vời để đưa tất cả chung "hoạt động" logic trong lớp BaseOperation
, nhưng vẫn có phương thức execute()
của lớp con cụ thể có kiểu trả về khác nhau.
Bây giờ tôi cần phải thay đổi cấu trúc này để cho phép các phương thức execute() có số lượng đối số thay đổi. Ví dụ, một lớp con cụ thể sẽ yêu cầu:
execute(String, int)
và khác sẽ cần:
execute(Date, Date, String)
Đây là khó khăn, bởi vì phương thức execute được khai báo trong lớp cơ sở. Chỉ đơn giản là quá tải các phương thức thực hiện trong cơ sở là không lý tưởng. Thứ nhất, lượng quá tải sẽ rất lớn. Thứ hai, mọi phân lớp sẽ chỉ sử dụng một trong các phương thức thực hiện, điểm của tất cả các phương thức khác là gì?
The (theo ý kiến của tôi) giải pháp dễ nhất sẽ được tuyên bố phương thức execute với varargs:
execute(Object... arguments)
Và sau đó nhìn xuống tất cả các đối số trong các lớp con:
execute(Object... arguments)
{
String s = (String) arguments[0];
...
}
Rõ ràng đây có 2 lớn downsides:
- Hiệu suất giảm do tất cả hoạt động downcasting
- Gọi phương thức
execute()
không còn được nhập đúng vì bất kỳ lượng đối tượng nào có thể được thông qua cảnh báo trình biên dịch witout.
Có các mẫu hoặc giải pháp nào khác không thể có những nhược điểm này không?
Tôi thích cách logic của ông về đầu vào được yêu cầu được mã hóa thành các thuộc tính (các trường) của chính lớp con (với các phương thức thiết lập cần thiết), chứ không phải là một lớp bean riêng biệt. Tuy nhiên, không có gì ngăn cản tôi gọi hàm execute() mà không thiết lập các tham số appropiate. Điều này có thể được giải quyết? – user1884155
@ user1884155 Có, chuyển đối số trong hàm tạo hoạt động, xem chỉnh sửa của tôi;) – NiziL
Ah, hiển nhiên. Tôi thích giải pháp này trong giải pháp javabean 'đơn giản' vì tất cả các tham số của tôi là bắt buộc và tôi không muốn giới thiệu một lớp bean bổ sung cho mọi lớp hoạt động mà tôi tạo ra. Cảm ơn! – user1884155