单例模式是一种常用的设计模式,用于确保一个类仅有一个实例
懒汉式
public class Abc {
private static Abc a;
private Abc() {}
public static Abc getA() {
if (a == null) {
a = new Abc();
}
return a;
}
}
线程不安全,因为可能存在多个线程同时进入if
判断内,从而创建多个实例
饿汉式
public class Abc {
private static final Abc a = new Abc();
private Abc() {}
public static Abc getA() {
return a;
}
}
饿汉式在类加载时就完成了实例的初始化,所以它是线程安全的,但这种方式会提前占用资源。
使用枚举实现单例
// 使用枚举实现单例模式
public enum EnumSingleton {
// 定义一个枚举元素,它本身就是这个类的唯一实例
// 注意:这里不需要显式地创建对象,因为枚举常量在枚举定义时就已经被创建了
INSTANCE; // 这就是我们的单例
// 你可以在这里定义任何方法或字段,它们都将属于这个单例
// 例如,我们定义一个打印消息的方法
public void printMessage() {
System.out.println("Hello from Enum Singleton");
}
// 通常情况下,你不需要在枚举单例中实现获取实例的方法,
// 因为你可以直接通过枚举常量名来访问这个单例。
// 但为了展示如何通过方法访问,我们可以这样做(虽然这不是必需的):
public static EnumSingleton getInstance() {
// 直接返回枚举常量,这是线程安全的,因为INSTANCE在枚举定义时就已经被创建了
return INSTANCE;
}
}
因为枚举类型是线程安全的