最近在重構open sdk的場景中,遇到了如下場景。java
首先,抽象了響應的數據結構,並經過兩個靜態方法來構建響應。api
後來,咱們構建了不一樣的Response類型,用以綁定對應不一樣的請求。這樣就能夠共用一個execute 方法。bash
AResponse aResponse = api.execute(aRequest);
數據結構
(想象中)的類圖關係:ui
(想象中)的客戶端代碼調度:spa
AResponse aResponse=AResponse.success("hello");
BResponse bResponse=BResponse.success(1);
CResponse cResponse=CResponse.success(now);
複製代碼
(想象中)實現代碼:設計
public static <T> BaseResponse<T> success(T data) {
BaseResponse instance = getInstance();
instance.setSuccess(true);
instance.setData(data);
return instance;
}
public static <T> BaseResponse<T> fail(String errorCode, String errorHint) {
BaseResponse instance = getInstance();
instance.setSuccess(false);
instance.setErrorCode(errorCode);
instance.setErrorHint(errorHint);
return instance;
}
static abstract <F extends BaseResponse> F getInstance();
複製代碼
「static abstract F getInstance();」 報錯「Illegal combination of modifiers :'abstract' and 'static'」code
java語言的定義:cdn
咱們知道實例方法是可使用abstract 描述的,不妨作一個比較:對象
靜態方法 vs 實例方法
靜態方法 | 實例方法 |
---|---|
靜態方法與它們所在的類相關聯。可不須要實例來調用。 | 實例方法屬於類的實例而不屬於類,便可以在建立類的實例以後調用它們。 |
它們的設計目的是在同一個類中建立的全部對象之間共享。 | 從類建立的每一個單獨的實例都有本身的該類實例方法的副本。 |
靜態綁定來解析。 | 動態綁定進行解析 |
沒法覆蓋。 | 能夠被覆蓋 |
由於靜態綁定的緣故,沒法覆蓋就成了一個天然的推導。而「abstract」的存在便是爲了進行子類行爲覆蓋父類規範的修飾符。所以,abstract' 和 'static‘ 沒法組合使用。
邏輯和狀態角度:
static 主要是關於無狀態的邏輯計算,完成static 語句塊或方法體的前提是「計算前,全部參與計算的因素都是肯定的。
e.g.
咱們沒法將instance實例化這樣的一個定義在靜態環境裏的行爲延遲到運行時動態肯定,當success 被執行的時候,它須要一個十分肯定的參數 instance。
public static <T> BaseResponse<T> success(BaseResponse instance,T data) {
instance.setSuccess(true);
instance.setData(data);
return instance;
}
複製代碼
總結
因此abstract 爲何沒法和static 組合使用?