簡體   English   中英

一個帶有變量返回類型和變量輸入參數的java方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM