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

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)

参考文献

Baeldung

Effective Java 3rd

总结

1.使用静态工厂构造对象,产生的对象是可控的。可以参加单例模式

2.构造器不用承接复杂逻辑

3.见名之义,写很多构造器会给后继者产生误导

4.一个item就可以研究好几天,贵在精,不在快





猜你喜欢

转载自www.cnblogs.com/aibilim/p/e81016a22ab54b1a3297137137cce33d.html