java 中abstract 爲何沒法和static 組合使用

場景描述

最近在重構open sdk的場景中,遇到了如下場景。java

  1. 要針對針對不一樣的請求響應不一樣的數據。
  2. 可以明確告知業務請求成功/失敗。
  3. 若是失敗了,可以給出響應的錯誤信息。

首先,抽象了響應的數據結構,並經過兩個靜態方法來構建響應。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 組合使用?

  1. 「邏輯和狀態分離」原則的實踐。
相關文章
相關標籤/搜索