今天分享给大家一个实用的开发技巧, 创建一个返回值为泛型的对象构建函数, 要求是传入返回值类的 class 对象.
例如: 平时我们开发接口的时候发现很多响应类里面基本都会有`code`和`error`两个属性, 而且有的人会将常量的枚举值作为接口调用成功的返回值, 这时候每次都会在接口的末尾处 new 一个接口响应值返回给调用者, 而这时候我们可以统一将这个创建含有成功响应值对象封装为一个方法.
为了节省更多重复代码, 我们会将封装这个方法定义在一个父类中.
父类代码改造前代码:
/**
* @Title: BaseResponse
* @Description:
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
@Data
@NoArgsConstructor
public class BaseResponse implements Serializable {
private static final long serialVersionUID = -8383361046902228836L;
protected String code;
protected String errorMsg;
}
思路: ①由于我们不能创建一个对象传入而返回, 这样就无法达到我们减少代码量的需求了, 所以就要用到 java 的反射机制去构建对象, 最后得到参数为 class 对象. ②既然是在父类中定义, 那构建的对象必须就是它的子类, 这时候就需要用到泛型去限制了.
ok, 整理好思路了就开始改造父类了.
父类代码改造后代码 :
/**
* @Title: BaseResponse
* @Description:
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
@Data
@NoArgsConstructor
public class BaseResponse implements Serializable {
private static final long serialVersionUID = -8383361046902228836L;
protected String code;
protected String errorMsg;
public static T setResult(Class tClass, ResponseEnum responseEnum) throws Exception {
Constructor constructor = tClass.getConstructor(ResponseEnum.class);
return constructor.newInstance(responseEnum);
}
/**
* 调用的子类需要重写父类的 BaseResponse(ResponseEnum responseEnum) 构造器
*/
public static T success(Class tClass) {
try {
return setResult(tClass, ResponseEnum.NORMAL_SUCCESS);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static T failure(Class tClass) {
try {
return setResult(tClass, ResponseEnum.SYSTEM_ERROR);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public BaseResponse(ResponseEnum responseEnum) {
this.code = responseEnum.code();
this.errorMsg = responseEnum.errorMsg();
}
}
响应枚举 ResponseEnum.java:
/**
* @Title: ResponseEnum
* @Description: 响应类实体
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
public enum ResponseEnum {
NORMAL_SUCCESS("000000", "成功"),
SYSTEM_ERROR("000001", "系统异常");
private final String code;
private final String errorMsg;
ResponseEnum(String code, String errorMsg) {
this.code = code;
this.errorMsg = errorMsg;
}
public String code() {
return code;
}
public String errorMsg() {
return errorMsg;
}
}