Effective Java 学习笔记(3)

在实现singleton模式时,我们有以下几种方法。

1. public static final 字段加上private 的构造函数。

public class Singleton{
            public static final Singleton INSTANCE = new Singleton();
            private Singleton() { ... }
}

这种方法简单,其中的字段让人一目了然就知道这个类是Singleton模式,用final关键字确保这个变量在初始化后就不会再被更改,但要注意的是小心防止少数别有用心的程序使用AccessibleObject.setAccessible来访问私有构造函数,这时可以在私有构造函数中判断当创建第二个实例的时候抛出一个异常。

2. private static final 字段加上private 的构造函数再加上public 静态工厂函数

public class Singleton{
            private static final Singleton INSTANCE = new Singleton();
            private Singleton() { ... }
            public static Singleton getInstance{}{return INSTANCE;}

}

这种方式不用担心性能问题,因为现在的JVM会把绝大多数的静态工厂函数改为内联。此外,这种方法还可以在不改变API的情况下对返回值进行改变,即在以后根据需要是否返回第二个实例,或是每个线程一个实例。

对于以上两种方法在串行化的时候要注意,不能仅仅只加上implements Serializable接口,这样会导致每次反序列化的时候创建一个新对象,这样就不是真正的singleton了,解决这个问题的方法是在声明的时候对每一个final字段加上transient关键字,然后再实现一个readResolve方法。

private Object readResolve() {
           return INSTANCE;
}

对于java 1.5后的版本,实现singleton模式最好的方法是用枚举。


public enum Singleton {
              INSTANCE;

}

这种方法没有上面说的缺点,是最优的方法。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mutsinghua/archive/2010/01/16/5199124.aspx

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值