原创

Effective Java读书笔记——创建和销毁对象

用静态工厂方法替代构造器

类可以提供一个公有的静态工厂方法,只是一个返回类的实例的静态方法。而不是对应于设计模式中的工厂方法。

一、静态工厂方法与构造器不同的优势

1、它们有名称,可读性高

如果构造器的参数本身没有确切地描述正被返回的对象,那么具有名称的静态工厂方法会更容易使用,产生的客户端代码也更易于阅读。

当一个类需要多个带有相同签名的构造器时,就用静态工厂放啊代替构造器,并且仔细地选择方法名称以便突出静态工厂方法之间的区别。

2、不必在每次调用他们的时候都创建一个新对象

如果程序经常请求创建相同的对象,并且创建对象的代价很高,则可以极大地提升性能。

静态工厂方法能够为重复的调用返回相同对象。

3、它们可以返回原返回类型的任何子类型的对象

API可以返回对象,同时又不会使对象的类变成公有的。以这种方式隐藏实现类会使API变得非常简洁。

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

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

二、静态工厂方法的缺点

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

2、 程序员很难发现它们

三、下面是一些静态工厂方法的惯用名称

  1. from —— 类型转换方法,它只有单个参数,返回该类型的一个相对应的实例。
  2. of —— 聚合方法,带有多个参数,返回该类型的一个实例,把他们合并起来。
  3. valueOf —— 比from和of更繁琐的一种替代方法。
  4. instance或者getInstance —— 返回的实例是通过方法的参数来描述的,但是不能说与参数具有同样的值。
  5. create或者newInstance —— 像instance或者getInstance一样,但是能够确保每次调用都返回一个新的实例。
  6. getType —— 像getInstance一样,但是在工厂方法处于不同的类中的时候使用。Type表示工厂方法所返回的对象类型。
  7. newType —— 像newInstance一样,但是在工厂方法处于不同的类中的时候使用。Type表示工厂方法所返回的对象类型。
  8. type —— getType和newType的简版。

示例如下:

    // from
    Date d=Date.from(instant);

    // of
    Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);


    // valueOf
    BigInteger bigInteger = BigInteger.valueOf(Integer.MAX_VALUE);

    // instance或者getInstance
    StackWalker stackWalker = StackWalker.getInstance(options);

    // create或者newInstance
    Object newArray = Array.newInstance(classObject,arrayLen);

    // getType
    FileStore fs = Files.getFileStore(path);

    // newType
    BufferedReader bufferedReader = Files.newBufferedReader(path);

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

学海无涯苦作舟

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-12-16 10:05
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码