程序员这行干的久了,总会染上一些恶习,我就染上一个让人疾恶如仇,本人却津津有味的习惯,还不想改的那种,它能够叫做强迫症,也能够叫做洁癖。那就是我不容许我的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...
看完之后想必有所播种吧~ 想要理解更多精彩内容,欢送关注公众号:程序员阿鉴,阿鉴在公众号欢送你的到来~