effective java(一)
考虑使用静态工厂方法代替构造器
静态工厂方法相比构造器的优势:
- 它们有名称_。根据方法名字可以清楚的知道可以获得什么样子的对象
- 不必再每次调用的时候都创建一个新对象。
- 它们可以返回原返回类型的任何子类型的对象。
- 在创建参数化类型实例的时候,它们是代码变得更加简洁 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45//Service provider framework sketch(描述) 
 //Service interface
 public interface Service{
 ...//service specific methods
 }
 //Service provider interface
 public interface Provider{
 public Service newService();
 }
 //noninstantiable(不可实例化的) class for service registration and success
 public class Services{
 //prevents instantiation (阻止实例化)
 private Services{
 }
 //maps service name for services
 private static final Map<String, Provider> providers =
 new ConcurrentHashMap<String, Provider>();
 //
 public static final String DEFAULT_PROVIDER_NAME = "<def>";
 //provider registration API
 public static void registerDefaultProvider(Provider p){
 registerProvider(DEFAULT_PROVIDER_NAME, p);
 }
 public static void registerProvider(String name, Provider p){
 providers.put(name, p);
 }
 //Services access API
 public static Service newInstance(){
 return newInstance(DEFAULT_PROVIDER_NAME);
 }
 public static Service newInstance(String name){
 Provider p = providers.get(name);
 if(p == null){
 throw new IllegalArgumentException(
 "No provider register with name :" + name);
 }
 return p;
 }
 }
静态工厂方法的主要缺点:
- 类如果不含公有的或者受保护的构造器,就不能被子类化
- 它们其他的静态方法实际上没有任何区别
 下面是静态工厂方法的一些惯用名称1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12valueOf —————— 不太严格的讲,改方法返回的实例与它的参数具有相同的值。这样的静态工厂方法实际上是类型转换方法 
 of —————— valueOf 的一种更为简洁的替代,在EnummSet中使用并流行起来
 getInstance —————— 返回的实例通过方法的参数描述的,但是不能够说与参数具有同样的值,对于singleton来说,该方法没有参数并返回唯一实例
 newInstance —————— 与getInstance一样,但是newInstance能确保返回的每个实例都与其他实例不同
 getType —————— 与getInstance一样,但是在工厂方法处于不同类中的时候使用,Type表示工厂方法所返回的对象类型
 newType —————— 像newInstance一样,但是在工厂方法处于不同类中的时候使用,Type表示工厂方法所返回的对象类型
遇到多个构造器参数时考虑使用构建器
| 1 | 
 |