Appearance
源码: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));
}
}