Effective Java读书笔记一

最近开始读Joshua Bloch的Effective Java的第二版,打算花一些时间把它看完。记得上一次读它的第一版还是在大学的时候,转眼间已经是4年之久了。上次因为各种原因并没有把第一版看完,所以这次一定要好好的读一下它的第二版。

 

废话少说,今天看了它的第二章:Creating and Destroying Objects(第一章是介绍),这一章包含了7个条目:

 

一、使用static factory methods(静态工厂方法)代替构造函数

static factory methods和Factory Method设计模式没有直接关系。

 

Joshua列举了使用static factory methods的四个好处:
1. static factory methods可以有自己的名字,容易编写自解释的代码,而构造函数不行。
2. 使用static factory methods不用每次都创建一个新的对象,可以根据需要来创建,比如Boolean.valueOf(boolean)这个static factory methods,根据参数,这个方法返回的是Boolean.TRUE或者是Boolean.FALSE。
3. static factory methods返回的对象可以是该方法返回类型的任意子类型。比如在java.util.Collections内部就有很多的static factory methods,它们根据不同的条件返回不同的Collection框架下的子类。

Joshua总结了关于Service Provider Framework的四个组件:

  • Service interface:需要Provider来实现的,比如JDBC里的Connection;
  • Provider registraction API:系统用来注册Service的,比如JDBC里的DriverManager.registerDriver;
  • Service Access API:这个是用来获得Service实例的,比如JDBC里的DriverManager.getConnection;
  • Service provider interface:这个是可选的,Provider实现该接口来创建Service的实现,比如JDBC里的Driver;

下面是一个Service Provider Framework的一个架子:

 

4. 在创建带有泛型类型的类的实例时,使用static factory methods可以消除创建时的一些冗余。
比如我们常见的HashMap的创建:

 

这种创建方式需要重复两次泛型类型,而且还会让这个创建代码变得很长、很复杂。
我们可以在HashMap内用带有泛型的static factory methods来解决这个问题(这个也就是众所周知的type inference):

 

有了上面的这个static factory method,我们就可以让创建代码变成以下这样:

 

 

当然,static factory methods也有两个缺点:
首先,如果一个类只提供了static factory methods,而没有提供public或者protected的构造方法,那么这个类就没有办法被继承;
其次,static factory methods不太容易与其它的static methods区分,对于这个问题,Joshua建议使用一些常用的static factory methods名,例如:

  • valueOf——返回和参数拥有相同值的对象
  • of——和valueOf差不多,一般用于EnumSet
  • getInstance——根据参数类型返回对应的对象,这个用在Singleton模式里是无参数的
  • newInstance——创建新的对象
  • getType——这个一般用在工具类里用来得到其它类的实例
  • newType——和getType差不多,不过它用来创建其它类的实例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值