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
相关产品推荐
相关产品推荐

