关于java:高效JAVA之用静态工厂方法代替构造器

45次阅读

共计 3329 个字符,预计需要花费 9 分钟才能阅读完成。

程序员这行干的久了,总会染上一些恶习,我就染上一个让人疾恶如仇,本人却津津有味的习惯,还不想改的那种,它能够叫做强迫症,也能够叫做洁癖。那就是我不容许我的 IDEA 呈现一点点正告,什么黄色背景,绿色波浪线,通通不容许,按下 F2 键必须是这样

当然,说这些也没有意义,因为并没有说如何去做,所以明天我筹备开一个新的系列——如何写出高效清新的 Java 代码,这意味着这整个系列的所有案例都会非常谨严且刻薄。如果有小伙伴说:这一丁点性能有什么嘛,无所谓啦。我:不,一丁点也不容许!

高效:开发高效,性能高效

明天是第一篇——应用动态工厂办法代替结构器

名字的重要性

一千个人眼里有一千个哈姆雷特,一千个我的项目里有个一千个通用响应对象,比方ApiResponseResponseResultBaseResult 等等,它们的构造个别都像这样

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…

看完之后想必有所播种吧~ 想要理解更多精彩内容,欢送关注公众号:程序员阿鉴,阿鉴在公众号欢送你的到来~

正文完
 0