Kotlin 之单例

本文介绍了在Kotlin中实现单例的四种方法:1) 使用`object`关键字实现简洁的单例;2) 通过`companion object`结合`lazy`实现懒加载单例;3) 利用`companion object`存储Android的`Application`单例;4) 使用匿名内部类创建无类名对象。每种方法都对比了与Java单例的相似之处,并提供了Bytecode反编译的解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
在学完kotlin的基本语法之后,大部分同学开始尝试用kotlin实现单例模式,今天我们就来看看kotlin可以怎么实现单例。通常java中写单例方式非常多,如:懒汉,饿汉,静态内部类,枚举,双重校验锁等等,然而在kotlin里实现单例模式就比java简单很多,甚至一行代码就能实现单例模式。
实现
单例1

object Singleton

一行代码就可以搞定一个单例,初学者看到这里估计会一脸懵逼,这不就是kotlin里面定义的一个对象么?关键是它就是类似java中懒汉式单例的一个对象,不信我们来看看kotlin团队是怎么生成的这个对象(菜单Tools > Kotlin > Show kotlin Bytecode > Decompile ):

public final class Singleton {

       public static final Singleton INSTANCE;
       private Singleton() {
          INSTANCE = (Singleton)this;
       }
       static {
          new Singleton();
       }
    }

So ga!是不是和java中的懒汉模式单例的实现方式一样。

单例2

  class Singleton private constructor() {
          companion object {
             val instance: Singleton by lazy { Singleton() }
          }
     }

这种方式的单例多了几行代码。
private constructor~私有话构造方法,禁止手动创建对象;
companion object~伴生对象,每个类都可以实现一个伴生对象,它是该类的所有实例共有的对象。它将类似于Java中的静态字段;
by lazy~懒加载, 可以在我们使用这个对象时再对其创建。

单例3

class App : Application() {
        companion object {
            lateinit var instance: App
                private set
        }
        override fun onCreate() {
            super.onCreate()
            instance = this
        }
    }

这个严格来说不能说是实现单例,而是怎么获取安卓中系统创建的单例Application对象。
companion object~伴生对象来储存App唯一单例对象;
lateinit var~lateinit来修饰instance,可以延迟加载instance对象(在使用它时进行赋值);
private set~私有化setter方法, 用于说明外部类不能对其进行赋值。

单例4

var obj = object { }

这是一种没有类名的对象,我们来看看kotlin团队用java编译出来的class是怎样的(菜单Tools > Kotlin >Show kotlin Bytecode > Decompile ):

这里写图片描述

这个就是创建的一个Object对象的静态匿名内部类。

总结
在kotlin里中以上四种单例实现方式足够在我们开发了,如果大家对kotlin还有什么更好的方式实现单例的方式推荐,欢迎一起学习,共同进步!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值