JavaJava In Mind

使用静态工厂方法代替构造函数

2019-10-15  本文已影响0人  SevenLin1993

技术公众号:Java In Mind(Java_In_Mind),欢迎关注!

前言

我相信大部分都看过《Effective Java》这本Java神书,这本书在我学习Java的路上给了我帮助可以说是受益匪浅,书中第一篇就建议:考虑用静态工厂方法代替构造器。我自从看了之后就开始使用实践该建议,到现在已经基本偏爱静态工厂方法,这里我就谈谈使用以来的一些领悟。

使用静态工厂方法的优缺点

优点
缺点

静态工厂方法有名称

这点确实是很好地优势,静态工厂方法有自己的名称,也就意味着可以表达某种意思,或者某些特殊的实例,例如,在使用一些通用返回结果的时候,可以用类似如此的静态工厂方法来创建实例:

public class Result {
        private boolean success;
    private String message;
    private Object content;
  
    private Result(boolean success,String message,Object content){
            this.success = success;
            this.message = message;
            this.content = content;
    }
        
    public static Result ofSuccess(Object content){
            return new Result(true,"处理成功",content);
    }
    
    public static Result ofFail(String message){
      return new Result(false,message,null);
    }
  
    // getter and setter...
}
//使用
Result.ofSuccess(content);
Result.ofFail("处理失败,找不到该记录");

这样子,通过静态工厂方法就可以很好表达要构造的对象的目的,而调用方可以比较方便获取实例。

不必每次调用都创建一个新对象

这个其实很常见,如Boolean类中的几个valueOf静态工厂方法,Boolean有两个静态域:TRUEFALSE,这样就不用每次创建一个新对象:

public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
}

其实,我们在使用单例的时候,通常获取单例的方法就是一个静态工厂方法,并且也是不用创建一个新的对象:

public class SingleTon {
    private static SingleTon singleTon = new SingleTon();
    
    private SingleTon() {
    }

    public static SingleTon getInstance() {
        return singleTon;
    }
}

可以返回原类型的任何子类型的对象

静态工厂方法返回的实例可以是该类型的子类,而这个子类可以在编写静态工厂方法时不存在,这也就意味着可以由其他方来实现,也意味着对拓展友好,还可以根据静态工厂方法的入参来选择不同的实现,非常灵活。

创建参数化类型实例的时候,它们使代码更加简洁

静态工厂方法还有一个好处就是提高代码的简洁度,也使得代码更加易读:

类如果不含公有的或者受保护的构造器,就不能被子类化

类不含有public或者protect的构造方法时,子类的构建需要使用到父类的构造器,这个时候静态工厂方法就不适合

静态工厂方法与其他静态方法没有任何区别

使用静态工厂方法的时候,如果该类包含其他的静态方法,那么这个时候对于开发编程是不友好的,特别是在方法比较多,命名比较混乱的时候,使用者不能一眼就知道该用哪个方法来构造自己想要的实例,所以在编写静态工厂方法的时候尽量使用大家习惯的、约定俗成的命名风格:

总结

结合我个人的经验,我认为使用静态工厂方法的利大于弊:

上一篇 下一篇

猜你喜欢

热点阅读