Effective Java--枚举类型的

本文深入探讨了单例模式的两种实现方式:懒汉式和枚举类型。详细介绍了懒汉式的线程安全实现,并指出其资源节约的优点及序列化难题等缺点。进一步推荐使用枚举类型实现单例模式,因其具备天然的序列化机制和防止多重实例化的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

既解决了”懒汉式“的多线程问题,又解决了资源浪费的现象,看上去是一种不错的选择,如下:

public class Foo {
    private static Foo foo;

    // 构造函数私有化
    private Foo() {
    }

    // 提供一个全局的静态方法
    public static Foo getFoo() {
        if (foo == null) {
            synchronized (Foo.class) {
                if (foo == null) {
               foo = new Foo();
                }
            }
        }
        return foo;
    }
}

单例模式的优缺点分析:


优点:客户端使用单例模式的实例的时候,只需要调用一个单一的方法即可生成一个唯一的实例,有利于节约资源。


缺点:首先单例模式很难实现序列化,这就导致采用单例模式的类很难被持久化,当然也很难通过网络传输;其次由于单例采用静态方法,无法在继承结构中使用。

--------------------------------------------------------------------------------------------------------------------------------------

《effective java》里面已经承认单元素枚举类是实现单例模式最好的方法(从java1.5版本开始)
单元素枚举类型更加简洁、无偿的提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击时;它已经成为实现Singleton的最佳方法。

/**
 * 枚举类型的单例模式(不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象)
 * 编写一个包含单个元素的枚举类型[极推荐]
 * @author Administrator
 *
 */
public enum MaYun {
himself; //定义一个枚举的元素,就代表MaYun的一个实例
// private String name;
   MaYun() {
//MaYun诞生要做的事情
//可以去掉
System.out.println("MaYun出生了!");
}
public void callAll() {
System.out.println("大家都来看呀!!!");
}
}

call: MaYun.himself.callAll();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值