Skip to content

源码:labs/java/runtime-concurrency/singleton-dcl/src/EnumSingleton.java

  • 原始路径:labs/java/runtime-concurrency/singleton-dcl/src/EnumSingleton.java
  • 类型:java
java
/**
 * enum 单例(Effective Java 推荐写法)。
 *
 * 特点:
 * - 懒加载:❌ 枚举类首次被引用时 JVM 即创建 INSTANCE(类加载即初始化)
 * - 线程安全:✅ 语言规范保证枚举常量唯一,无锁
 * - 防破坏:✅ 反序列化、反射创建第二个实例会被 JVM 拒绝
 * - 复杂度:最低;语义像「全局常量 + 行为」,难 mock、不能继承类
 *
 * Java 场景:
 * - ✅ 无参、逻辑简单的全局单例(工具门面、枚举型策略)
 * - ✅ 需防序列化/反射破坏的库代码、安全敏感入口
 * - ✅ Spring 之外的纯 Java 模块、Effective Java 式「最省心单例」
 * - ❌ 构造要参数、要懒到「第一次业务调用」、单元测试要替换实现 → 用 Holder 或 DI
 *
 * Android 场景:
 * - ✅ 无 Context、无复杂 init 的小工具(与进程同寿的全局对象)
 * - ⚠️ 带 Application 初始化、异步 SDK 的管理器:更常用 Holder 或 Application.onCreate
 * - ⚠️ Kotlin 业务层更惯用 object;Hilt @Singleton 替代手写 enum
 * - enum 不解决 Context 泄漏;持 Context 仍须 applicationContext
 *
 * 局限:
 * - 不能像普通类那样继承;多实现用 interface + enum implements
 * - 测试框架对 enum 单例 mock 不友好
 *
 * 如何运行:
 * - javac -d out src/*.java
 * - java -cp out EnumSingleton
 *
 * 预期输出:
 * - 两次输出同一个枚举实例名,same instance = true
 */
public enum EnumSingleton {
    INSTANCE;

    public static void main(String[] args) {
        EnumSingleton a = EnumSingleton.INSTANCE;
        EnumSingleton b = EnumSingleton.INSTANCE;
        System.out.println(a);
        System.out.println(b);
        System.out.println("same instance = " + (a == b));
    }
}