1.用静态方法代替构造器
在Java中,对类而言,实例化一个对象的传统方式是提供公用的构造方法,还有一种方法就是,通过静态工厂的方式来获取一个对象的的实例。本文将详细介绍其中原因。
通常我们获取对象的常用方法是通过类的构造器new出来,但是我们在写代码的过程中应当避免这种方式,采取静态工厂方法的方式获取对象。(不是一定指设计模式中的 [ 静态工厂方法 ](https://blog.csdn.net/qq_38941937/article/details/112797985))
好处
- 静态工厂相比于构造方法,它们可以有更为形象的名称。
- 静态工厂相比于构造方法,在某些情况下,不必每次使用一个对象时,就创建它,可以通过静态工厂方法,返回单一的,不可变的对象。从而避免的不必要的重复对象。
- 静态工厂可以返回原返回对象类型的子类型对象,在选择对象返回类型时提高代码灵活性。
- 静态工厂返回的类型可以根据参数的不同,每次发生变化,只要是返回以声明返回对象类型的子类型对象即可。
- 静态工厂方法返回的对象所属类,在编写包含该静态工厂方法的类时可以不存在的。
坏处
- 静态工厂方法的第一个缺点在于,类如果没有共有的构造器,或者构造器受保护,就不能被子类化(不能被其他类实现)。
- 静态工厂方法的第二个缺点在于,很难找到目标工厂方法,因为没有像构造器一样在API中明确的标识出来。
静态工厂方法惯用名称
- form—类型转换方法,它只有单个参数,返回类型的一个实例,把他们合并起来,eg:
Date d =Date.fom( instant );
- of—聚合方法,带有多个参数,返回类型的一个实例,把他们合并起来,eg:
Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);
- valueOf—比form和of更烦琐的一种替代方法,eg:
BigInteger prime =BigInteger .valueOf(Integer.MAX_VALUE);
- instance或者getInstance—返回的实例是通过方法的(如有)参数来描述的,但是不能说与参数具有同样的值,eg:
StackWalker luke = StackWalker .getInstance(options);
- create或者newInstance—像instance或者getInstance,但这两个规范一般用于保证每次接口都会返回一个新的实例,eg:
Object newArray =Array.newInstance(classObject,arrayLen);
参考文章:https://www.jianshu.com/p/60e67e16d991