【Java笔记(50)】EffectiveJava第三条之用私有构造器或者枚举类型强化Singleton属性

目录

  • 一、大白话
  • 二、三种方式
    • 1、公有静态final成员
    • 2、私有构造,静态工厂方法
    • 3、单个元素枚举类型

一、大白话

  • 关于单例模式可以利用三种方式就行加强
  • 1、使用一个public static final 单例类 变量名 = new 单例类()
  • 2、使用私有的静态工厂方法public static 单例类 getInstance(){}
  • 3、使用包含单个元素的枚举类型

二、三种方式

1、公有静态final成员

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

2、私有构造,静态工厂方法

  • 采用静态工厂方法,还分为懒汉式饿汉式,对于懒汉式在多线程的时候,并不安全,可以使用反射就行改进.
  • 对于单例对象序列化之后的反序列化会出现一个新的实例,这里可以使用transient关键字对实例化属性就行修饰.
  • 并提供一个readResolve()方法
  • 对象序列化需要implements Serializable
public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() { }
    public static Elvis getInstance() { return INSTANCE; }
}
private Object readResolve() {
            return INSTANCE;
}

3、单个元素枚举类型

  • 使用单元素枚举类型的功能与使用公有静态final成员类似,但是更加简介,并且可以提供序列化机制
  • 单元素的枚举类型经常称为实现Singleton的最佳方法
public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() {
        System.out.println("Whoa baby, I'm outta here!");
    }

    public static void main(String[] args) {
        Elvis elvis = Elvis.INSTANCE;
        elvis.leaveTheBuilding();
    }
}

你可能感兴趣的:(JAVA学习笔记)