Effective Java读书笔记三

        

Item 3:用private的构造函数或者enum类型来增强singleton模式

先说一个singleton模式的缺点:使用singleton模式会让依赖于它的代码难于测试,因为在测试的时候我们无法用创建一个mock来隔离singletong对象。除非singleton类实现了一个interface,而我们的代码依赖于这个interface。所以在日常工作中,如果需要使用singleton模式的话,最好在它和singleton类之间做一个隔离,好让我们在测试的时候创建mock隔离它。

在Java 5.0之前,singleton模式常见的实现方式有两种:
第一种:

第二种:

第一种的好处是非常清晰,而且现在的JVM对final类型会在编译时将其inline到调用它的地方,所以对性能也有好处;
第二种的好处也很明显,首先如果Foo需要加载的资源非常大的话,可以将它的初始化放在需要的时候再做,也就是我们常说的晚加载;另外一个是使用这种factory method, 我们可以在需要的时候改变singleton模式,将其改为非singleton的,或者是每个线程一个实例的模式。

关于singleton模式的对象序列化的时候也需要注意,应该把所有的instance字段定义为transient,然后提供一个readResolve方法:

 
Java 5.0之后,singleton实现模式可以用enum类型来实现:

这种方式和上面的第一种一样,只不过它利用enum的特性,使类结构更加简单,把我们提到的序列化问题自动解决了。所以,从Java 5.0以后,enum方式是singleton模式的首选。

            

Item 4:用private的构造函数增强类的不可实例化特性

这一条主要针对工具类。说实话,我从来没有想过将一个纯工具类实例化,当然我们不能保证哪个神人会这么做,所以为了防止这个意外发生,我们一般都要将工具类的默认构造函数private化。注意:在类上加上abstract是不能阻止它被实例化的,因为我们可以继承它或者用它来创建一个匿名内部类的对象等。

将构造函数private化后,还是可以通过反射来创建它的对象,我们还可以通过在构造函数中抛出异常来进一步阻止对象的创建:

这么做有一个缺点,就是这个工具类无法被继承了,所以在使用的时候需要注意这一点。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值