静态工厂方法代替构造器
一、大白话二、静态工厂方法1、方法的优点① 有名字② 能返回该类(接口)的子类③ 避免同个对象多次生成④ 方法返回的对象的所属类,在编写该静态方法的类时可以不存在
2、缺点① 同时也要构造方法② 程序员很难发现这些方法
三、总结
一、大白话
1、传统的实例化对象就是用
new 类名
,来调用构造方法实例化对象。
2、实际上还有另一种方法:使用类中的静态方法返回一个实例化对象,
也就是EffectiveJava书中的第一条,静态工厂方法,以下对书中进行总结。
二、静态工厂方法
1、方法的优点
① 有名字
传统的构造方法只能是类名,使用静态工厂方法就能有他自己的名字,newInstance()…
② 能返回该类(接口)的子类
public abstract class EnumSet<E
extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java
.io
.Serializable
{
EnumSet(Class
<E>elementType
, Enum
[] universe
) {}
public static <E
extends Enum<E>> EnumSet
<E> noneOf(Class
<E> elementType
) {
if (universe
.length
<= 64)
return new RegularEnumSet<>(elementType
, universe
);
else
return new JumboEnumSet<>(elementType
, universe
);
}
}
在类EnumSet中,可以使用静态工厂方法返回一个本类的子类,这两个实现类对客户端是不可见的。返回的对象的类可以随着每次的参数改变。
③ 避免同个对象多次生成
先构造好一个实例,在调用的时候就将这个实例返回,避免了重复初始化实例。 这一点在单例设计模式就使用到。
④ 方法返回的对象的所属类,在编写该静态方法的类时可以不存在
不懂
2、缺点
① 同时也要构造方法
如果类中没有公有或者受保护的构造方法,那么子类将无法继承,这里就需要采用复合。(复合后面后提到)
② 程序员很难发现这些方法
在编写的时候需要规范的注释静态工厂
三、总结
静态工厂方法和构造器各有用处,需要理解各自的长处静态工厂方法更适合在第一时间要想到的是静态工厂方法,而不是构造方法