給定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 {
<p style="text-indent:2em"/>private static final long serialVersionUID = -8383361046902228836L;
<p style="text-indent:2em"/>protected String code;
<p style="text-indent:2em"/>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 {
<p style="text-indent:2em"/>private static final long serialVersionUID = -8383361046902228836L;
<p style="text-indent:2em"/>protected String code;
<p style="text-indent:2em"/>protected String errorMsg;
<p style="text-indent:2em"/>public static <T extends BaseResponse> T setResult(Class<T> tClass, ResponseEnum responseEnum) throws Exception {
<p style="text-indent:2em"/><p style="text-indent:2em"/>Constructor<T> constructor = tClass.getConstructor(ResponseEnum.class);
<p style="text-indent:2em"/><p style="text-indent:2em"/>return constructor.newInstance(responseEnum);
<p style="text-indent:2em"/>}
<p style="text-indent:2em"/>/**
<p style="text-indent:2em"/> * 調用的子類需要重寫父類的 BaseResponse(ResponseEnum responseEnum) 構造器
<p style="text-indent:2em"/> */
<p style="text-indent:2em"/>public static <T extends BaseResponse> T success(Class<T> tClass) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>try {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>return setResult(tClass, ResponseEnum.NORMAL_SUCCESS);
<p style="text-indent:2em"/><p style="text-indent:2em"/>} catch (Exception e) {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>e.printStackTrace();
<p style="text-indent:2em"/><p style="text-indent:2em"/>}
<p style="text-indent:2em"/><p style="text-indent:2em"/>return null;
<p style="text-indent:2em"/>}
<p style="text-indent:2em"/>public static <T extends BaseResponse> T failure(Class<T> tClass) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>try {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>return setResult(tClass, ResponseEnum.SYSTEM_ERROR);
<p style="text-indent:2em"/><p style="text-indent:2em"/>} catch (Exception e) {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>e.printStackTrace();
<p style="text-indent:2em"/><p style="text-indent:2em"/>}
<p style="text-indent:2em"/><p style="text-indent:2em"/>return null;
<p style="text-indent:2em"/>}
<p style="text-indent:2em"/>public BaseResponse(ResponseEnum responseEnum) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.code = responseEnum.code();
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.errorMsg = responseEnum.errorMsg();
<p style="text-indent:2em"/>}
}
響應枚舉 ResponseEnum.java:
/**
* @Title: ResponseEnum
* @Description: 響應類實體
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
public enum ResponseEnum {
<p style="text-indent:2em"/>NORMAL_SUCCESS("000000", "成功"),
<p style="text-indent:2em"/>SYSTEM_ERROR("000001", "系統異常");
<p style="text-indent:2em"/>private final String code;
<p style="text-indent:2em"/>private final String errorMsg;
<p style="text-indent:2em"/>ResponseEnum(String code, String errorMsg) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.code = code;
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.errorMsg = errorMsg;
<p style="text-indent:2em"/>}
<p style="text-indent:2em"/>public String code() {
<p style="text-indent:2em"/><p style="text-indent:2em"/>return code;
<p style="text-indent:2em"/>}
<p style="text-indent:2em"/>public String errorMsg() {
<p style="text-indent:2em"/><p style="text-indent:2em"/>return errorMsg;
<p style="text-indent:2em"/>}
}
