最近在重构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 组合使用?