高效Java之使用静态工厂方法替代构造方法

优点

1、 与构造方法不同,静态方法拥有名字

     例如返个可能为素数的BigInteger的构造方法BigInteger(int, int, Random)可以更好的表示为BigInteger.probablePrime的静态工厂方法(不是很明白这个方法的作用)。

    在类中似乎需要具有相同签名的多个构造方法的情况下,用静态工厂方法替换构造方法,并仔细选择名称来突出他们的差异。

2、 不需要每次调用都创建一个新对象

   允许不可变类使用预先构建的实例,并反复分配他们以避免创建不必要的重复对象。Boolean.valueof(boolean)方法演示了这个模式的优点。这种类也被称为实例控制类(instance-controlled)

3、 可以返回其返回类型的任何子类对象

    这种灵活性的一个一个应用是API可以返回对象而不需要公开他的类,这种方式隐藏实现类会使API非常紧凑,这种技术使用于基于接口的框架。

    在Java 8之前,接口不能有静态方法。从Java8要求所有接口的静态成员都是公共的,Java9允许私有静态方法、但静态字段和静态成员类仍然需要公开;Java集合框架有45个接口的实用工具实现,提供不可修改的集合、同步集合等等。大多是这些工具类都是隐藏的,不可实例化的Collections称为他们的伙伴类(companion class)

4、 返回对象的类可以根据输入参数的不同而不同。

  可以返回任何声明类型的子类

   EnumSet类没有公共构造方法,只有静态工厂,根据传入枚举值的数量返回set的类型(当类型少于65个时,每个枚举值只占长整型的一位,位置根据枚举值在类中的序列数决定(ordinal)),大多数枚举值都少于64个,这样会非常节省资源

5、 在编写包含该方法的类时,返回的对象的类不需要存在(基于接口设计)

   这种方式构成了服务提供者框架的基础:服务接口、注册API,功能API中大多都由静态成员来保存数据、实现功能。

例如JDBC中 connection是服务接口的一部分,DeriverMananger.registerDriver提供注册API,DeriverManager.getConnection是服务访问API

缺点 

1、 未提供公共或受保护构造方法的类不能被子类化

2、 静态工厂方法比构造方法更容易被人忽略

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章