当前位置: 首页 > article >正文

Kotlin 中companion object {} 什么时候触发

在 Kotlin 中,companion object 的初始化触发时机是一个重要但容易被忽视的细节。以下是详细的解释:

1. 基本触发时机

companion object 的初始化发生在:

  • 首次访问该类时(无论是访问伴生对象成员、创建类实例,还是通过反射访问类)

  • 类似于 Java 的静态初始化块,但更灵活

  • class MyClass {companion object {init {println("Companion object 初始化!") }val CONST = "Hello"}
    }fun main() {println("程序启动")MyClass.CONST  // 第一次访问 MyClass 时触发初始化
    }

 输出

程序启动
Companion object 初始化!

2. 具体触发场景

以下操作都会触发 companion object 初始化:

(1) 直接访问伴生对象成员

MyClass.CONST          // 触发
MyClass.Companion      // 触发

(2) 创建类实例

val obj = MyClass()    // 触发

(3) 通过反射访问类

MyClass::class          // 触发(Kotlin 反射)

(4) 访问类的其他声明

MyClass::class          // 触发(Kotlin 反射)

3. 不会触发的情况

以下操作不会触发初始化:

// 仅声明类型(未实际访问)
val clazz: Class<MyClass> = MyClass::class.java  // 作为类型参数(未实例化或访问)
fun process(clazz: Class<*>) {}
process(MyClass::class.java)  // 不会触发

4. 与 Java 静态初始化的对比

特性Kotlin companion objectJava static 块
初始化时机首次访问类时类加载时
懒加载是(按需初始化)否(类加载时强制初始化)
线程安全是(JVM 保证)

5. 实际应用中的注意事项

(1) 性能优化
class HeavyInitialization {companion object {val HEAVY_RESOURCE = loadResource() // 避免在伴生对象中放重型初始化}
}// 改为懒加载
class BetterApproach {companion object {val heavyResource by lazy { loadResource() }}
}
(2) 循环依赖问题
class A {companion object {val VALUE = B.VALUE  // 如果 B 的伴生对象也依赖 A,会导致栈溢出}
}class B {companion object {val VALUE = A.VALUE}
}

解决方案:使用 lazy 延迟初始化

class A {companion object {val VALUE by lazy { B.VALUE }}
}

6. 验证示例

class Test {companion object {init { println("伴生对象初始化") }}init { println("类实例初始化") }
}fun main() {println("阶段1")Test::class  // 仅访问 KClass,不触发println("阶段2")Test.Companion // 触发初始化println("阶段3")Test() // 伴生对象已初始化,不会再次触发
}

输出

阶段1
阶段2
伴生对象初始化
阶段3
类实例初始化

总结

  • companion object 在首次真正使用类时初始化(懒加载)
  • 比 Java 的静态初始化更灵活,但逻辑相似
  • 适合存放类级别的常量、工厂方法等
  • 避免在伴生对象中直接进行重型操作,建议用 by lazy

http://www.lryc.cn/news/2398151.html

相关文章:

  • 仿真每日一练 | Workbench中接触种类及选择方法简介
  • Go语言中的rune和byte类型详解
  • superior哥AI系列第6期:Transformer注意力机制:AI界的“注意力革命“
  • 【java面试】redis篇
  • 高效易用的 MAC 版 SVN 客户端:macSvn 使用体验
  • 【搭建 Transformer】
  • 自然图像数据集
  • Linux下使用nmcli连接网络
  • HCIP(BGP综合实验)
  • Attention Is All You Need (Transformer) 以及Transformer pytorch实现
  • uniapp+vue2+uView项目学习知识点记录
  • 精美的软件下载页面HTML源码:现代UI与动画效果的完美结合
  • 车载诊断架构 --- DTC消抖参数(Trip Counter DTCConfirmLimit )
  • javaEE->IO:
  • Oracle 用户/权限/角色管理
  • 使用免费wordpress成品网站模板需要注意点什么
  • 深入理解 JSX:React 的核心语法
  • 工厂方法模式深度解析:从原理到应用实战
  • TS 星际通信指南:从 TCP 到 UDP 的宇宙漫游
  • python可视化:端午假期旅游火爆原因分析
  • Missashe考研日记—Day51-Day57
  • electron-vite_18桌面共享
  • SOC-ESP32S3部分:28-BLE低功耗蓝牙
  • Git-flow流
  • VirtualBox给Rock Linux9.x配置网络
  • 知识图谱增强的大型语言模型编辑
  • .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
  • 【claude+deepseek+gemini】基于李群李代数和螺旋理论工业机器人控制系统软件UI设计
  • 阿里云国际站,如何通过代理商邀请的链接注册账号
  • 乾坤qiankun的使用