首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
分布式数据库
›
Kotlin 中companion object {} 什么时候触发
返回列表
发新帖
Kotlin 中companion object {} 什么时候触发
[复制链接]
发表于 2025-6-26 16:28:01
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
在 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
回复
使用道具
举报
返回列表
来自云龙湖轮廓分明的月亮
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表