Android 单例模式(Java + Kotlin 最全写法)
单例模式:一个类在整个应用中只有一个实例,全局共用,避免重复创建、节省内存。
Android 特别注意:
- 禁止单例持有 Context(会内存泄漏!)
- 必须用 Application Context
- 线程安全、懒汉式(用的时候才创建)最常用
一、Java 版(Android 最常用 5 种)
1. 静态内部类单例(推荐 🔥 最优)
线程安全、懒加载、效率高,Android 开发首选。
public class Singleton {
// 私有构造
private Singleton() {}
// 静态内部类
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
-
双重校验锁 DCL(常用)
public class Singleton {
private static volatile Singleton instance;private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; }}
-
饿汉式(简单)
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
} -
枚举单例(最安全)
Java 官方推荐,防反射、防序列化破坏。public enum Singleton {
INSTANCE;
public void doSomething() {}
} -
Android 常用:带 Context 的单例(防泄漏)
public class AppManager {
private static AppManager instance;
private Context context;private AppManager(Context context) { // 必须用 Application Context this.context = context.getApplicationContext(); } public static AppManager getInstance(Context context) { if (instance == null) { synchronized (AppManager.class) { if (instance == null) { instance = new AppManager(context); } } } return instance; }}
二、Kotlin 版(Android 现代写法 🔥)
Kotlin 写单例超级简单!
-
最简单例(object 关键字)
Kotlin 官方标准单例,一行搞定object Singleton {
// 这里写方法
fun doSomething() {}
}
使用:
Singleton.doSomething()
-
懒汉式 + 线程安全(by lazy)
class Singleton private constructor() {
companion object {
val instance: Singleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
Singleton()
}
}
} -
双重校验锁 DCL(Kotlin)
class Singleton private constructor() {
companion object {
@Volatile
private var instance: Singleton? = nullfun getInstance(): Singleton { return instance ?: synchronized(this) { Singleton().also { instance = it } } } }}
-
Android 带 Application 的单例
class AppManager private constructor(context: Context) {
init {
// 全局 Application Context
val appContext = context.applicationContext
}companion object { @Volatile private var instance: AppManager? = null fun getInstance(context: Context): AppManager { return instance ?: synchronized(this) { AppManager(context).also { instance = it } } } }}
三、Android 开发必须记住的规则
- 构造函数必须私有
- 禁止单例持有 Activity、View(内存泄漏)
- 用 Context 必须用 Application
- 多线程环境必须线程安全
- Kotlin 优先用 object,Java 优先用 静态内部类
四、快速选择方案
| 语言 | 推荐写法 | 优点 |
|---|---|---|
| Java | 静态内部类 | 线程安全、懒加载、最优 |
| Java | 枚举单例 | 最安全、防反射 |
| Kotlin | object | 最简单、官方推荐 |
| Kotlin | by lazy | 灵活、懒加载 |
总结
- Java 最优:静态内部类单例
- Kotlin 最优:object 单例(一行代码)
- Android 禁忌:单例不要持有 Activity / View
- Context 必须:用 Application