Effective Java -- 创建和销毁对象 -- 用静态工厂方法代替构造器

(从今天开始啃Effective Java!)

第一章 引言

跳过

第二章 创建和销毁对象

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

一 例子

    public static Boolean valueOf(boolean b) {
        return b ? Boolean.TRUE : Boolean.FALSE;
    }

二 与构造器相比的优势

1 有名称

更有阅读性。
比如用BigInteger.probablePrime的静态工厂方法来取得素数明显比BigInteger(int,int,Random)更加清楚。

2 不必每次调用都创建新对象

如果程序经常请求创建相同的对象,并且创建对象的代价很高时,可以极大提升性能。
能够为重复的调用返回相同的对象。

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

返回对象有了更大的灵活性。
比如API可以返回对象,同时又不会使对象的类变为公有的。

4 所返回的对象的类可以随着每次调用而变化

如EnumSet:如果它的元素小于等于64个,静态工厂方法会返回一个RegalarEnumSet实例,用单个long支持;如果它的元素大于64个,静态工厂方法会返回一个JumboEnumSet实例,用一个long数组支持。
客户端不需要关心他们从工厂方法中获得的类,在未来的版本中添加或者删除EnumSet的实现都不会造成任何负面影响。

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

(此处还不是很理解,日后回过头再看看)
这是服务者框架的基础,例如JDBC API。
服务者框架:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把它们从多个实现中解耦出来。
服务者框架三个重要组件:服务接口(提供者实现的)、提供者注册API(提供者用来注册实现的)、服务访问API(客户端用来获取服务的实例)。
服务者框架第四个可选组件:服务提供者接口(产生服务接口实例的工厂对象)。
对于JDBC来说,Connection就是其服务接口的一部分,DriverManager.registerDriver是提供者注册API,DriverManager.getConnection是服务访问API,Driver是服务提供者接口。

三 缺点

1 类如果不含公有的或者受保护的构造器,就不能被子类化
2 程序员很难发现它们

四 静态工厂方法的一些惯用名称

  1. from —— 类型转换方法,只有单个参数,返回该类型的一个实例
Date d = Date.from(instant);
  1. of —— 聚合方法,带有多个参数,返回该类型合并的一个实例
Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);
  1. valueOf —— 比from和of更繁琐的一种替代方法
BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
  1. instance 或者 getInstance —— 返回的实例是通过方法的参数来描述的,但是不能说与参数具有同样的值
StackWalker luke = StackWalker.getInstance(options);
  1. create 或者 newInstance —— 同getInstance,但每次调用都返回一个新的实例
Object newArray = Array.newInstance(classObject,arrayLen);
  1. getType —— 同getInstance,但在工厂方法处于不同的类中的时候使用,Type表示工厂方法所返回的对象类型
FileStore fs = Files.getFileStore(path);
  1. newType —— 同newInstance,但在工厂方法处于不同的类中的时候使用,Type表示工厂方法所返回的对象类型
BufferedReader br = Files.newBufferedReader(path);
  1. type —— getType和newType的简版
List<Complaint> litany = Collections.list(legacyLitany);

五 总结

静态工厂经常更加合适,因此切忌第一反应就是提供公有的构造器,而不考虑静态工厂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值