Effective Java 读书笔记:(1) 用静态方法代替构造器

用静态方法替代构造器

对于一个类而言,为了让客户端获取到它的一个实例.在通常情况下,是提供这个类的构造器.
类可以提供一个公有的静态工厂方法(static factory method),这是一个返回类的实例的静态方法.

实例 : 下面是一个来自Boolean(基本类型boolean的装箱类)的简单实例,这个方法将boolean类型装换为一个Boolean的引用

//JDK1.8
   public static final Boolean TRUE = new Boolean(true);
   public static final Boolean FALSE = new Boolean(false);
   public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
    }

优点 :

1. 静态工厂方法可以拥有名称,产生的代码更容易阅读.

一个类只能有一个带有指定签名(类名)的构造器,程序员在编程的过程中可以通过参数列表的变化来实现多个构造器.(在没有参考文档时,这些API容易被搞混)
由于静态工厂方法有名称,可以使用静态工厂方法代替构造器,可以用不同的签名来标识不同静态工厂方法的区别(更加直观).
示例 :

BigInteger(int,int,Random); //返回的可能是素数
BigInteger.probablePrime(int,Random) //可以直观的表示返回值可能为素数

2. 静态工厂方法,不必在每次调用它的时候都创建一个新对象.

这样带来的好处是可以使用预先构建好的实例或者将构建好的实例缓存起来,进行重复利用.(极大程度降低了创建相同对象的消耗)
这样有助于严格控制某个时刻哪些实例应该存在.

3.可以返回原返回类型的任何子类型的对象

这样使我们在选择返回对象时有了更大的灵活性,API可以返回对象,同时又不会使对象的类变成公有的.
示例:

public static people getInstance(){
return new Man(); 
}

4. 方法所返回的对象的类可以随着每次调用而发生变化,这取决与静态工厂方法的参数值

这使得调用者不用详细了解
示例:

  public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }

5. 方法返回的对象所属的类,在编写包含该静态方法的类时可以不存在

在JDBC连接的过程中 ,使用了服务提供者框架[会详细说明].

缺点

1. 类如果没有公有或者受保护的构造器,就不能被子类化

2. 对于提供了静态工厂方法而不是构造器,要想查明如何实例化一个类是非常困难的

你可能感兴趣的:(Effective,Java)