关于java:Java高级特性泛型泛型实战封装统一的服务端响应类

35次阅读

共计 2970 个字符,预计需要花费 8 分钟才能阅读完成。

在平时工作中,咱们写代码可能都在堆增删改查,很少有机会加上 Java 的高级个性。比方,泛型,你肯定在 Mybatis、Hibernate 这些长久化框架中用过。可轮到本人开发的时候,却发现这个货色几乎鸡肋,齐全用不上。

置信我,这种感觉很失常。因为开源框架往往要用同一套算法,来应答不同的数据结构,而 Java 的高级个性能缩小反复代码,从而进步我的项目的可维护性。

然而,咱们可能身处小公司,我的项目做完就间接交给客户了。你在最短时间实现工作就行,我的项目齐全没有保护的必要。

然而,没有关系。这次咱们来解锁泛型,用它来封装一个服务端返回类。

需要剖析

不晓得你有没有接手过一些老我的项目?那时候,SpringMVC 才刚刚进去,大家对代码标准也没概念。后果,碰上个这么不便的框架,后端开发人员就想也不想,间接把各种实体类返回给前端。

然而,工夫一久,问题就来了。

首先,数据没法保障一致性。你申请某个接口的时候,如果传入的参数不同,失去的后果必定也会不同。你看上面这个例子:

// 获取用户信息,正确返回
{
    "username": "jiarupc",
    "nickname": "法外狂徒、张三",
    "create_date": "2020-12-31 00:00:00"
}

// 获取用户信息,谬误返回
{"msg": "短少参数,请传入 token"}

而后,前端没法解决。你想想看,一个接口如果有时候就返回一堆用户信息,有时候又只返回一条错误信息,这得写多少 if-else 判断呀?

最初,没法团队单干。如果碰上简单的我的项目,起码也要几个人一起开发。这时候,要是返回格局没有一个规范,每个人都依照本人的想法轻易写,那我的项目迟早得乱套。

事实上,在接手一些老我的项目时,你会常常看到这种状况。业务明明不简单,但只有改了一点货色,好几个前端页面就白屏了。

这时候,如果你想基本解决问题,就必须封装对立服务端响应类。

设计 - 服务端响应类

服务端响应类有 2 个要点:返回值、错误码。

先来看返回值。在返回前端的时候,咱们必须要有这 3 个信息:

  1. code,响应代码;
  2. data,响应数据;
  3. msg,响应信息;

其中,咱们还要进一步设计 响应代码,让它能适配更简单的环境,这里给出几个罕用的响应码,你也能够依据理论状况本人设计。

  1. 200- 申请胜利
  2. 101- 执行谬误
  3. 102- 参数谬误

整体的设计工作就实现了,看起来没啥技术含量,可值得你器重。软件开发中,有些工作尽管很简略,但影响重大,服务端响应类就是这样。

那么,接下来就是开发工作了。

开发 - 服务端响应类

首先,定义 响应代码,我用的是枚举。

public enum ResponseCode {

    // 胜利返回
    SUCCESS(200, "SUCCESS"),
    // 执行谬误
    ERROR(101, "ERROR"),
    // 参数谬误
    ILLEGAL_ARGUMENT(102, "ILLEGAL_ARGUMENT"));

    private final int code;
    private final String desc;

    ResponseCode(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // 省略 getter 办法
}

而后,创立 服务端响应类。其中,为了让 data- 响应数据 适配更多的业务场景,咱们用泛型来定义它。

public class ServerResponse<T> implements Serializable {
    
    // 响应代码
    private int code;
    // 响应信息
    private String msg;
    // 响应数据
    private T data;

    /**
     * 构造方法
     */
    private ServerResponse(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    private ServerResponse(int code, T data) {
        this.code = code;
        this.data = data;
    }
    private ServerResponse(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    private ServerResponse(int code) {this.code = code;}

    /**
     * 申请胜利
     * @param msg  返回信息
     * @param data 泛型数据
     * @param <T>  返回数据,能够不填
     * @return 1. 状态码(默认)2. 返回信息 3. 泛型数据
     */
    public static <T> ServerResponse<T> createSuccess(String msg, T data) {return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), msg, data);
    }
    public static <T> ServerResponse<T> createSuccess(T data) {return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), data);
    }
    public static <T> ServerResponse<T> createSuccess(String msg) {return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), msg);
    }
    public static <T> ServerResponse<T> createSuccess() {return new ServerResponse<>(ResponseCode.SUCCESS.getCode());
    }

    /**
     * 申请失败
     * @param code
     * @param msg
     * @return 1. 状态码(自定义)2. 返回信息(自定义)*/
    public static <T> ServerResponse<T> createError(int code, String msg) {return new ServerResponse<>(code, msg);
    }
    public static <T> ServerResponse<T> createError() {return new ServerResponse<>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());
    }
    public static <T> ServerResponse<T> createError(String msg) {return new ServerResponse<>(ResponseCode.ERROR.getCode(), msg);
    }

    
    // 省略 getter 办法
}

开发工作也实现了,接下来,咱们能够做出规定,在 Controller 层 Service 层 中,返回数据必须是 ServerResponse,不许重整旗鼓。

到了这儿,老我的项目的数据凌乱问题,就被圆满解决了。

写在最初

泛型是 Java 的高级个性,但咱们很少在工作中用到,然而没有关系。在老我的项目中,前后端交互没有对立的数据规范,这正好是机会。

为了解决这个问题,咱们封装了对立的服务端返回类 ServerResponse,这其中 data- 响应数据 用到了泛型,为的是适应更多的业务场景。

文章演示代码:点击跳转

正文完
 0