Effective Java 第1条 用静态方法代替构造器

1.用静态方法代替构造器

在Java中,对类而言,实例化一个对象的传统方式是提供公用的构造方法,还有一种方法就是,通过静态工厂的方式来获取一个对象的的实例。本文将详细介绍其中原因。


通常我们获取对象的常用方法是通过类的构造器new出来,但是我们在写代码的过程中应当避免这种方式,采取静态工厂方法的方式获取对象。(不是一定指设计模式中的 [ 静态工厂方法 ](https://blog.csdn.net/qq_38941937/article/details/112797985))

好处

  1. 静态工厂相比于构造方法,它们可以有更为形象的名称。
  2. 静态工厂相比于构造方法,在某些情况下,不必每次使用一个对象时,就创建它,可以通过静态工厂方法,返回单一的,不可变的对象。从而避免的不必要的重复对象。
  3. 静态工厂可以返回原返回对象类型的子类型对象,在选择对象返回类型时提高代码灵活性。
  4. 静态工厂返回的类型可以根据参数的不同,每次发生变化,只要是返回以声明返回对象类型的子类型对象即可。
  5. 静态工厂方法返回的对象所属类,在编写包含该静态工厂方法的类时可以不存在的。

坏处

  1. 静态工厂方法的第一个缺点在于,类如果没有共有的构造器,或者构造器受保护,就不能被子类化(不能被其他类实现)。
  2. 静态工厂方法的第二个缺点在于,很难找到目标工厂方法,因为没有像构造器一样在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

猜你喜欢

转载自blog.csdn.net/qq_38941937/article/details/114902911