关于单例模式的实现有很多种,网上也分析了如今实现单利模式最好用枚举,好处不外乎三点:
1.线程安全
2.不会因为序列化而产生新实例
3.防止反射攻击
关于第二点 序列化问题,有一篇文章说枚举类自己实现了 readResolve() 方法,所以抗序列化,这个方法是当前类自己实现的( 解决 )
关于第一点 线程安全,从反编译后的类源码中可以看出也是通过类加载机制保证的,应该是这样吧( 解决 )关于第三点 反射攻击,我有自己试着反射攻击了以下,不过报错了...看了下方的反编译类源码,明白了,因为单例类的修饰是abstract的,所以没法实例化。
举个枚举的例子:
public enum MaYun {
//定义一个枚举的元素,就代表MaYun的一个实例
himself;
private String anotherField;
MaYun(){
//MaYun诞生要做的事情
//这个方法也可以去掉。将构造时候需要做的事情放在instance赋值的时候
/**himself() = MaYun(){
*MaYun诞生要做的事情
*}
*/
System.out.println("初始化");
}
public void splitAlipay(){
System.out.println("Alipay是我的啦!");
}
}
public class Main {
public static void main(String[] args){
MaYun.himself.splitAlipay();
}
}