用枚举类型实现Singleton属性是更好的选择

实现Singleton方式大概有三种

前两种,把构造器私有,导出公有静态成员

1. 公有静态成员是一个final域

需要考虑反射攻击问题

2. 公有静态成员是一个静态工厂方法

需要考虑序列化的问题,因为仅仅在声明上加上"implements Serializable"是不够的。必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法。否则,每次反序列化一个序列化的实例时,都会创建一个新的实例

第三种方法:枚举

在jdk 1.5版本后,只需编写一个包含单个元素的枚举类就可以实现Singleton

public enum Elvis {
    INSTANCE;

    public void leaveTheBuildings() {
        System.out.println("leave");
    }
}

调用时直接这样写:

Elvis.INSTANCE.leaveTheBuildings();

好处在于:

1. 更加简洁

2. 无偿提供序列化机制

3. 绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候

 

所以,总而言之,目前枚举是实现Singleton的最佳方法

posted on 2017-10-15 10:13  evanxwj  阅读(204)  评论(0编辑  收藏  举报