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
相关推荐
WG_172 小时前
Linux44:POSIX信号量:
java·开发语言
WZTTMoon2 小时前
Spring Boot 启动报错:OpenFeign 隐性循环依赖,排查了整整一下午
java·spring boot·后端·spring cloud·feign
苏渡苇2 小时前
Stream.collect() 的花式玩法:Collector.of() 自定义收集器
java·stream·jdk21·collector·jdk8+·自定义收集器
丶小鱼丶2 小时前
数据结构和算法之【队列】
java·数据结构
菜鸡儿齐5 小时前
Unsafe方法学习
java·python·学习
汤姆yu5 小时前
IDEA接入Claude Code保姆级教程(Windows专属+衔接前置安装)
java·windows·intellij-idea·openclaw·openclasw安装
prince058 小时前
用户积分系统怎么设计
java·大数据·数据库
967710 小时前
理解IOC控制反转和spring容器,@Autowired的参数的作用
java·sql·spring
SY_FC10 小时前
实现一个父组件引入了子组件,跳转到其他页面,其他页面返回回来重新加载子组件函数
java·前端·javascript