给定class对象返回该类的实例
今天分享给大家一个实用的开发技巧, 创建一个返回值为泛型的对象构建函数, 要求是传入返回值类的 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, 整理好思路了就开始改造父类了.
【给定class对象返回该类的实例】父类代码改造后代码 :
/**
* @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;
}
}
推荐阅读
- 阿里云 OSS对象存储攻防
- Maven项目报错:“|Maven项目报错:“ SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”的解决方案
- UI 自动化的页面对象管理神器 PO-Manager
- python的列表生成式|python的列表生成式,生成器和generator对象你了解吗
- 笔记|二、对象与类、封装、构造方法
- Go|Go 结构体序列化的实现
- 《C++要笑着学》|【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针
- JS判断对象属性是否存在的五种方案分享
- 拿捏javascript对象增删改查应用及示例
- CGB2202|CGB2202面向对象第5天