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
相关推荐
DogDaoDao1 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
二哈赛车手1 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
JohnnyDeng942 小时前
Android 自定义 View:Canvas 绘图与事件分发深度解析
android
栗子~~2 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8292 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
未若君雅裁3 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记4 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI4 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
Android小码家5 小时前
Framework之Launcher小窗开发
android·framework·虚拟屏·小窗