Android:java kotlin 单例模式

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;
    }
}
  1. 双重校验锁 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;
     }

    }

  2. 饿汉式(简单)

    public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
    return instance;
    }
    }

  3. 枚举单例(最安全)
    Java 官方推荐,防反射、防序列化破坏。

    public enum Singleton {
    INSTANCE;
    public void doSomething() {}
    }

  4. 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 写单例超级简单!

  1. 最简单例(object 关键字)
    Kotlin 官方标准单例,一行搞定

    object Singleton {
    // 这里写方法
    fun doSomething() {}
    }

使用:

复制代码
Singleton.doSomething()
  1. 懒汉式 + 线程安全(by lazy)

    class Singleton private constructor() {
    companion object {
    val instance: Singleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
    Singleton()
    }
    }
    }

  2. 双重校验锁 DCL(Kotlin)

    class Singleton private constructor() {
    companion object {
    @Volatile
    private var instance: Singleton? = null

    复制代码
         fun getInstance(): Singleton {
             return instance ?: synchronized(this) {
                 Singleton().also { instance = it }
             }
         }
     }

    }

  3. 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
相关推荐
天空之城--10 分钟前
MT管理器Android逆向工程完全指南:从入门到实战
android
wxwx_bscxy32227 分钟前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
Anhty1 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
evans在进步2 小时前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio
渡我白衣3 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
电商API_180079052473 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11113 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
秋名RG3 小时前
2026/5/27 生产事故复盘与整改方案
java
血小板要健康4 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪4 小时前
【多线程】CompletableFuture使用
java·开发语言·多线程