You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin不使用object关键字创建单例及相关代码有效性验证

关于你提供的代码的单例判定

你给出的代码确实没有显式使用object关键字,是否生成单例要看声明位置:

  • Comparator是Kotlin的函数式(SAM)接口,你写的lambda表达式会被自动转换为该接口的匿名实现类实例,这个SAM转换过程本身不需要用到object关键字
  • 如果这行val a = Comparator<Int>{o1, o2 -> o1.compareTo(o2)}是顶层属性声明,Kotlin的顶层属性只会在类加载阶段初始化一次,全局只会存在一份a指向的实例,这种情况下你得到的就是单例
  • 如果这行代码是方法内部的局部变量声明,每次方法调用都会生成新的Comparator实例,就不属于单例

Kotlin中不使用object关键字创建单例的常用方法

原生Kotlin中不用object关键字也可以实现符合要求的单例,常见方案如下:

  • 顶层val + 私有构造方案
    将目标类的构造方法设为私有,在顶层声明唯一的实例属性,依靠顶层属性的单次初始化特性保证单例,实现最简单:

    class Singleton private constructor() {
        fun doWork() {
            // 单例的业务逻辑
        }
    }
    // 顶层val全局只会初始化一次
    val singletonInstance = Singleton()
    
  • 枚举类实现方案
    枚举类的每个枚举项天然是JVM层面的单例,不需要额外做同步控制,是线程安全的单例实现方案:

    enum class Singleton {
        INSTANCE;
        fun doWork() {
            // 单例的业务逻辑
        }
    }
    // 使用方式:Singleton.INSTANCE.doWork()
    

内容的提问来源于stack exchange,提问作者ntos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:06:01