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. “逻辑和状态分离”原则的实践。
相关文章
相关标签/搜索