Item1:静态工厂方法替代构造器
优势
1.静态工厂方法可以命名
- 构造器没有名字
- 构造器重载过多,不知道实际返回对象含义
BigInteger(int, int, Random)
该构造器实际返回对象表示该对象可能是一个质数。
如果实际提供一个BigInteger.probablePrime静态工厂方法,可以做到见名知义 - 构造器重载过多会导致构造对象困难
- 需要多个构造器的类可以提供多个静态工厂方法
2.创建对象可控
- 构造方法每次调用都会new新对象
- 静态工厂方法创建对象时可自由控制,可每次new,可缓存
- instance-controlled=实例受控,用于确保单例
3.可以返回子类实例
- 构造器没得选,只能返回当前类型
- 静态工厂方法可以返回子类对象
4.返回对象的类型可以根据输入参数的不同而不同
- EnumSet会根据枚举类成员的个数确定返回那个具体实现类
- JumboEnumSet
- RegularEnumSet
5.静态工厂可以返回接口类型,运行时才需要实现类
劣势
1.没有公共或受保护构造方法的类不能被继承
2.相比构造器,静态工厂方法不好找
命名规约
1.from类型转换方法,接受单个参数并返回此类型的相应实例
Date d = Date.from(instant);
2.of聚合方法,接受多个参数并返回该类型的实例,并把他们合并在一起
Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
3.valueOf
BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
4.getinstance返回一个由其参数 (如果有的话) 描述的实例
StackWalker luke = StackWalker.getInstance(options)
5.newInstance
Object newArray = Array.newInstance(classObject, arrayLen)