第二章 创建和销毁对象

第1条: 用静态工厂方法代替构造器

优势
  • 静态工厂方法与构造器不同的第一大优势在于,它们有名称.
  • 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象.
  • 静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象.
  • 静态工厂方法的第四大优势在于,所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值.
  • 静态工厂方法的第五大优势在于,方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在.
缺点
  • 静态工厂方法的主要缺点在于,类如果不含公有的或者受保护的构造器,就不能被子类化.

  • 静态工厂方法的第二个缺点在于,程序员很难发现它们.

    • 一些惯用的名称

      • from: 类型转换方法,它只有单个参数,返回该类型的一个相对应的实例

        1
        Date d = Date.from(instant);
      • of: 聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来.

        1
        Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);
      • valueOf: 比fromof更繁琐的一种替代方法

        1
        BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
      • instance或者getInstance: 返回的实例是通过方法的(如有)参数来描述的,但是不能说与参数具有同样的值.

        1
        StackWalker luke = StackWalker.getInstance(options);
      • create或者newInstanceinstance或者getInstance一样,但create或者newInstance能够确保每次调用都返回一个新的实例

        1
        Object newArray = Array.newInstance(classObject,arrayLen);
      • getType: 像getInstance一样,但是在工厂方法处于不同的类的时候使用.Type表示工厂方法所返回的对象类型.

        1
        FileStore fs = Files.getFileStore(path);
      • newType: 像newInstance,但是在工厂方法处于不同类中时候使用,Type表示工厂方法所返回的对象类型.

        1
        BufferedReader br = Files.newBufferedReader(path);
      • type: getTypenewType的简版

        1
        List<Complaint> litany = Collections.list(legacyLitany);