美文网首页
Kotlin-单例实现方式

Kotlin-单例实现方式

作者: 杨0612 | 来源:发表于2022-03-31 18:27 被阅读0次
object关键字描述

以下定义了单例A,原理大家可以看看注释,其实也挺简单的。

    object A {
        fun test(){}
    }
    
 //反编译代码
public final class A {
   @NotNull
   public static final A INSTANCE;

   public final void test() {
   }

   private A() {
   }

   static {//类加载的时候实例化对象
      A var0 = new A();
      INSTANCE = var0;
   }
}

//调用处
A.test()
//调用处反编译,通过INSTANCE对象来访问
A.INSTANCE.test();
  • 使用场景:对内存影响不大,外部不需要传入参数。
by lazy单例

利用Kotlin by lazy的特性,保证对象只初始化一次,懒加载而且是线程安全。想知道原理可以看下https://juejin.cn/post/7087846746260242468

class MyApplication : Application() {
    val b by lazy { B() }
}

使用场景:对内存较敏感。

双重判断
class B private constructor(context: Context) {

    companion object {
       @Volatile private var instance: B? = null

        @JvmStatic
        fun getInstance(context: Context): B {
            instance ?: synchronized(B::class.java) {//1
                instance ?: {//2
                    instance = B(context)
                }
            }
            return instance!!
        }
    }
}
  • 注释1、2:如果instance为空则执行冒号后面的逻辑;
  • 注释3,将instance返回,不过这里用双引用总感觉有点问题,不知道有没有更好的处理方式。写法跟Java大体类似。
    使用场景:对内存较敏感,外部可以传入参数。
单例构建模板

如果多个类要定义成单例,那么以上代码就得写多次,我们可以抽象模板代码。

abstract class BaseSingleInstance<in P, out R> {//1
    @Volatile
    private var instatnce: R? = null//2

    abstract fun create(params: P): R//3

    fun getInstance(params: P): R {//4
        instatnce ?: synchronized(BaseSingleInstance::class.java) {
            instatnce ?: create(params).apply { instatnce = this }
        }
        return instatnce!!
    }
}

//子类实现
class B private constructor(context: Context) {//5

    companion object : BaseSingleInstance<Context, B>() {
        override fun create(params: Context) = B(params)
    }
}
  • 注释1:定义抽象类BaseSingleInstance,给子类伴生类实现,in P 表示入参为P, out R表示返回类型为R,in out控制泛型的作用域,前者为入参使用,后者为返回使用;
  • 注释2:定义instatnce,存储实例对象;
  • 注释3:抽象函数,由子类负责对象的构建;
  • 注释4:获取实例的方法,这个没什么好说的;
  • 注释5:子类B的实现。
    使用场景:多个类需要实现单例。

以上分析有不对的地方,请指出,互相学习,谢谢哦!

相关文章

  • Kotlin-单例实现方式

    object关键字描述 以下定义了单例A,原理大家可以看看注释,其实也挺简单的。 使用场景:对内存影响不大,外部不...

  • iOS 单例模式 - 单例对象销毁【@synchronized】

    单例对象的创建方式 单例.h 文件的实现 单例.m 文件的实现 单例对象的销毁【@synchronized创建方式...

  • iOS 单例模式 - 单例对象销毁【GCD】

    单例对象的创建方式 单例.h 文件的实现 单例的.m 文件的实现 单例对象的销毁【GCD创建的方式】 使用单例对象...

  • 单例模式的常用实现方式

    单例模式属于最常用的设计模式,Java中有很多实现单例模式的方式,各有其优缺点 实现方式对比 单例实现方式线程安全...

  • 单例模式(Singleton)- 通俗易懂的设计模式解析

    单例模式的实现方式单例模式的实现方式有多种,根据需求场景,可分为2大类、6种实现方式。具体如下: a. 初始化单例...

  • Python经典面试题21道

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • Python最经典面试题21道,必看!

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • Python 经典面试题

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • Python 经典面试题

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • 设计模式--单例模式

    单例模式概述 单例模式实现方式 为什么要使用单例模式 单例模式实现方式 饿汉式 类加载后就会将对象加载到内存中,保...

网友评论

      本文标题:Kotlin-单例实现方式

      本文链接:https://www.haomeiwen.com/subject/cxenjrtx.html