[英]A java method with both variable return type and variable input arguments
我有一個抽象的java類“BaseOperation”。 該類只有一個抽象方法:
public abstract T execute()
{
...
return T;
}
BaseOperation的子類必須實現此方法:
public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
...
@Override
public GetUsersResponse execute()
{
...
return GetUsersResponse;
}
}
這是將所有常見的“操作”邏輯放在BaseOperation
類中的好方法,但仍然讓每個具體子類的execute()
方法具有不同的返回類型。
現在我需要更改此結構以允許execute()方法具有可變數量的參數。 例如,一個具體的子類需要:
execute(String, int)
另一個需要:
execute(Date, Date, String)
這很棘手,因為execute方法是在基類中聲明的。 簡單地重載基礎中的執行方法並不理想。 首先,過載量將是巨大的。 其次,每個子類只會使用一種執行方法,其他所有方法的含義是什么?
(在我看來)最簡單的解決方案是使用varargs聲明execute方法:
execute(Object... arguments)
然后向下轉發子類中的所有參數:
execute(Object... arguments)
{
String s = (String) arguments[0];
...
}
顯然這有兩個主要缺點:
execute()
方法不再是嚴格類型的,因為任何數量的對象都可以通過編譯器警告傳遞。 是否存在可能沒有這些缺點的模式或其他解決方案?
您可以使用包含參數的bean:
public interface BaseOperation<T, U> {
T execute(U input);
}
public class GetUsersOperation implements BaseOperation<GetUsersResponse, UserInput> {
@Override
public GetUsersResponse execute(UserInput input) {
Date date = input.getDate();
return new GetUsersResponse(date);
}
}
您的抽象類只有一個抽象方法:更好地使用接口。 您可以實現多個接口,而只能擴展一個類。
如前所述,解決問題的常用方法是使用bean保存參數。 但這是基於構建器方法的另一種解決方案:
public interface BaseOperation<T> {
public T execute();
}
public class AddOperation implements BaseOperation<Integer> {
private int a, b;
public void setA(int arg){
a = arg ;
return this;
}
public void setB(int arg){
b = arg;
return this;
}
@Override
public Integer execute() {
return a+b ;
}
}
然后像這樣使用它:
new AddOperation().setA(1).setB(2).execute();
您可以通過以下方式混合必需參數和可選參數:
public class MultipleAddOperation implements BaseOperation<Integer> {
private int sum ;
public MultipleAddOperation(int requiredInt){
sum = requiredInt;
}
public void add(int optionalInt){
sum += optionalInt ;
return this;
}
@Override
public Integer execute(){
return sum;
}
}
所以:
new MultipleAddOperation(5).add(1).add(2).execute();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.