共计 3329 个字符,预计需要花费 9 分钟才能阅读完成。
程序员这行干的久了,总会染上一些恶习,我就染上一个让人疾恶如仇,本人却津津有味的习惯,还不想改的那种,它能够叫做强迫症,也能够叫做洁癖。那就是我不容许我的 IDEA 呈现一点点正告,什么黄色背景,绿色波浪线,通通不容许,按下 F2 键必须是这样
当然,说这些也没有意义,因为并没有说如何去做,所以明天我筹备开一个新的系列——如何写出高效清新的 Java 代码,这意味着这整个系列的所有案例都会非常谨严且刻薄。如果有小伙伴说:这一丁点性能有什么嘛,无所谓啦。我:不,一丁点也不容许!
高效:开发高效,性能高效
明天是第一篇——应用动态工厂办法代替结构器
名字的重要性
一千个人眼里有一千个哈姆雷特,一千个我的项目里有个一千个通用响应对象,比方ApiResponse
,ResponseResult
,BaseResult
等等,它们的构造个别都像这样
public class BaseResult<T> implements Serializable {
private static final long serialVersionUID = -9127050844792378533L;
/**
* 状态码
*/
private int code;
/**
* 音讯
*/
private String message;
/**
* 须要返回的数据对象
*/
private T data;
public BaseResult() {}
public BaseResult(int code, String message) {this(code, message, null);
}
public BaseResult(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// 省略 get/set 办法
}
个别咱们会定义 code 为 0,或者 200 什么的示意正确响应,其余的为谬误响应。
应用的示例如下:
public BaseResult<Order> getOrder(){Order order = new Order();
return new BaseResult<>(0, "胜利", order);
}
这样子应用咋一看如同没什么问题,那是因为我先通知大家 code= 0 是正确,再给出相应的示例,如果小伙伴间接看示例多半会懵住:0 是指什么?因为 0 在这里是个魔法值。或者说,正确的响应码产生变更,项目经理说,code= 0 太不难看了,改成 200!这个时候 … 完蛋。
这时候咱们能够多加一个专门用来形容 code
的类,如:
public interface ResultCode {
/**
* 正确响应码
*/
int SUCCESS = 0;
/**
* 谬误响应码
*/
int FAILURE = -1;
}
应用形式就产生了变更:
public BaseResult<Order> getOrder(){Order order = new Order();
return new BaseResult<>(ResultCode.SUCCESS, "胜利", order);
}
当初,咱们打消了魔法值,而且不论项目经理说把 code 改成啥都行,咱们只改 ResultCode.SUCCESS
的值就行。
项目经理:code 改成字符类型!
然而!如果每个接口的返回值都这样写,就会发现,整个我的项目都充斥这 new BaseResult<>(ResultCode.SUCCESS, "胜利", value)
这样的语句,这一行代码只有 value 不一样,其余全都截然不同,啊,这俊俏的代码。
于是,咱们持续改良,减少两个静态方法:
public static <T> BaseResult<T> success(T data){return new BaseResult<>(ResultCode.SUCCESS, ResultCode.SUCCESS_MESSAGE, data);
}
public static BaseResult<Void> failure(){return new BaseResult<>(ResultCode.FAILURE, ResultCode.FAILURE_MESSAGE);
}
在 ResultCode 类中减少两个常量:
String SUCCESS_MESSAGE = "胜利";
String FAILURE_MESSAGE = "失败";
如果每次
new BaseResult<>(ResultCode.SUCCESS, "胜利", order)
的话,胜利
这个字符串则会随着每次 new 出 BaseResult 而创立出一个字符串对象。
改良后的应用形式:
public BaseResult<Order> getOrder(){Order order = new Order();
return BaseResult.success(order);
}
使用者再也不须要关怀 code 是啥,cool~
项目经理:给我把 code 改 …. 开发:啪(巴掌声)
不用每次构建都创建对象
有时候调用的接口不须要返回参数,只须要响应一个正确或者失败即可,此时咱们就须要一个无参的 success
办法:
public static BaseResult<Void> success(){return new BaseResult<>(ResultCode.SUCCESS, ResultCode.SUCCESS_MESSAGE);
}
应用:
public BaseResult<Void> createOrder(){return BaseResult.success();
}
不晓得小伙伴有没有发现一个问题,这个无参的 success
办法每次返回的对象都是雷同的,然而每次都创立了一个新的对象进去!啊,蹩脚的代码!
改良:
public static final BaseResult<Void> SUCCESS = new BaseResult<>(ResultCode.SUCCESS, ResultCode.SUCCESS_MESSAGE);
public static final BaseResult<Void> FAILURE = new BaseResult<>(ResultCode.FAILURE, ResultCode.FAILURE_MESSAGE);
public static BaseResult<Void> success(){return SUCCESS;}
public static BaseResult<Void> failure(){return FAILURE;}
这里棘手把 failure 办法也改良一下
当初,每次调用无参 success` 办法时都应用一个动态对象,不再产生反复创立!爽!
留神,须要 data 数据的 BaseResult 不要这样做,否则会呈现线程平安问题
闭环
有时候接口不仅会与页面交互,服务与服务之间也会产生交互,这时候如果咱们想要判断其余接口的响应状况,会怎么做呢?
public void callOtherServer(){BaseResult<Void> result = createOrder();
if(result.getCode() == ResultCode.SUCCESS){// 正确}
}
现阶段咱们只能这样做,啊,这蹩脚的代码又呈现了!
改良:
public boolean isSuccess(){return this.code == ResultCode.SUCCESS;}
public boolean isFailure(){return this.code != ResultCode.SUCCESS;}
改良后的应用形式:
public void callOtherServer(){BaseResult<Void> result = createOrder();
if(result.isSuccess()){// 正确}
}
优雅的代码!
小结
本篇介绍了对于应用动态工厂办法代替结构器的美妙事件
第一:应用一个好名字对结构逻辑进行封装
第二:有时候并不需要每次反复的创建对象
第三:建设一个逻辑闭环
学会了的小伙伴看看本人的我的项目有没有改良的空间吧~
原创地址:https://zijiancode.cn/archive…
看完之后想必有所播种吧~ 想要理解更多精彩内容,欢送关注公众号:程序员阿鉴,阿鉴在公众号欢送你的到来~