当前位置: 首页 > 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

相关文章:

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

在 Kotlin 中&#xff0c;companion object 的初始化触发时机是一个重要但容易被忽视的细节。以下是详细的解释&#xff1a; 1. 基本触发时机 companion object 的初始化发生在&#xff1a; 首次访问该类时&#xff08;无论是访问伴生对象成员、创建类实例&#xff0c;还是通过…...

仿真每日一练 | Workbench中接触种类及选择方法简介

Workbench中给我们提供的接触类型主要包括以下几种&#x1f447; ◆ 1、摩擦 ◆ 2、无摩擦 ◆ 3、绑定 ◆ 4、不分离 ◆ 5、粗糙 ◆ 6、强制滑移 下面通过最常用的摩擦和绑定给大家展示两者的区别&#xff0c;同时文末也给大家介绍了几种接触的选择方法。首先先给大家介绍一下…...

Go语言中的rune和byte类型详解

1. rune类型 1.1. 基本概念 1. rune是Go语言的内建类型&#xff0c;它是int32的别名&#xff0c;即32位有符号整数&#xff1b; 2. 用于表示一个Unicode码点&#xff0c;全拼Unicode code point&#xff1b; 3. 可以表示任何UTF-8编码的字符&#xff1b; 1.2. 特点 1. 每…...

superior哥AI系列第6期:Transformer注意力机制:AI界的“注意力革命“

&#x1f3ad; superior哥AI系列第6期&#xff1a;Transformer注意力机制&#xff1a;AI界的"注意力革命" 嘿&#xff01;小伙伴们&#xff01;&#x1f44b; 今天superior哥要带你们探索AI界最火的技术——Transformer&#xff01;这个家伙可了不得&#xff0c;它不…...

【java面试】redis篇

redis篇 一、适用场景&#xff08;一&#xff09;缓存1、缓存穿透1.1 解决方案1&#xff1a;缓存空数据&#xff0c;查询返回的数据为空&#xff0c;将空结果缓存1.2 解决方案2&#xff1a;布隆过滤器 2、缓存击穿1.1 解决方案1&#xff1a;互斥锁1.2 解决方案2&#xff1a;逻辑…...

高效易用的 MAC 版 SVN 客户端:macSvn 使用体验

高效易用的 MAC 版 SVN 客户端&#xff1a;macSvn 使用体验 下载安装使用总结 最近有个项目要使用svn, 但是mac缺乏一款像 Windows 平台 TortoiseSVN 那样全面、高效且便捷的 SVN 客户端工具, 直到博主找到了该工具本文将结合实际使用体验&#xff0c;详细介绍 macSvn工具的核心…...

【搭建 Transformer】

搭建 Transformer 的基本步骤 Transformer 是一种基于自注意力机制的深度学习模型&#xff0c;广泛应用于自然语言处理任务。以下为搭建 Transformer 的关键步骤和代码示例。 自注意力机制 自注意力机制是 Transformer 的核心&#xff0c;计算输入序列中每个元素与其他元素的…...

自然图像数据集

目录 CIFAR-10 数据集CIFAR-100 数据集AFHQ 数据集FFHQ 数据集 CIFAR-10 数据集 简介&#xff1a; CIFAR-10 是一个经典的图像分类数据集&#xff0c;广泛用于机器学习领域的计算机视觉算法基准测试。它包含60000幅32x32的彩色图像&#xff0c;分为10个类&#xff0c;每类6000…...

Linux下使用nmcli连接网络

Linux下使用nmcli连接网络 介绍 在使用ubuntu系统的时候&#xff0c;有时候不方便使用桌面&#xff0c;使用ssh远程连接&#xff0c;可能需要使用nmcli命令来连接网络。本文将介绍如何使用nmcli命令连接网络。nmcli 是 NetworkManager 的命令行工具&#xff0c;用于管理网络连…...

HCIP(BGP综合实验)

一、实验拓扑 AS 划分&#xff1a; AS1&#xff1a;R1&#xff08;环回 L0:172.16.0.1/32&#xff0c;L1:192.168.1.0/24&#xff09;AS2&#xff1a;R2、R3、R4、R5、R6、R7&#xff08;内部运行 OSPF&#xff0c;AS 号为 64512 和 64513 的联盟&#xff09;AS3&#xff1a;R…...

Attention Is All You Need (Transformer) 以及Transformer pytorch实现

参考https://zhuanlan.zhihu.com/p/569527564 Attention Is All You Need (Transformer) 是当今深度学习初学者必读的一篇论文。 一. Attention Is All You Need (Transformer) 论文精读 1. 知识准备 机器翻译&#xff0c;就是将某种语言的一段文字翻译成另一段文字。 由…...

uniapp+vue2+uView项目学习知识点记录

持续更新中... 1、发送给朋友&#xff0c;分享到朋友圈功能开启 利用onShareAppMessage和onShareTimeline生命周期函数&#xff0c;在script中与data同级去写 // 发送给朋友 onShareAppMessage() {return {title: 清清前端, // 分享标题path: /pages/index/index, // 分享路…...

精美的软件下载页面HTML源码:现代UI与动画效果的完美结合

精美的软件下载页面HTML源码&#xff1a;现代UI与动画效果的完美结合 在数字化产品推广中&#xff0c;一个设计精良的下载页面不仅能提升品牌专业度&#xff0c;还能显著提高用户转化率。本文介绍的精美软件下载页面HTML源码&#xff0c;通过现代化UI设计与丰富的动画效果&…...

车载诊断架构 --- DTC消抖参数(Trip Counter DTCConfirmLimit )

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

javaEE->IO:

文件&#xff1a; 操作系统中会把很多 硬件设备 和 软件资源 抽象成“文件”&#xff0c;统一进行管理。 大部分谈到的文件&#xff0c;都是指 硬盘的文件&#xff0c;文件就相当于是针对“硬盘”数据的一种抽象 硬盘&#xff1a; 1.机械硬盘&#xff1a;便宜 2.固态硬盘&…...

Oracle 用户/权限/角色管理

1. 用户 1.1. 用户的创建和删除 1.1.1. 创建用户 create user user identified {by password | externally} [ default tablespace tablespace ] [ temporary tablespace tablespace ] [ quota {integer [k | m ] | unlimited } on tablespace [ quota {integer [k | m ] | …...

使用免费wordpress成品网站模板需要注意点什么

在使用免费 WordPress 成品网站模板时&#xff0c;需要从版权、安全性、兼容性、功能限制等多个方面谨慎考量&#xff0c;避免后续出现问题。以下是具体需要注意的要点&#xff1a; 一、版权与授权问题 明确授权类型 免费模板可能分为「开源免费」「限个人使用」「禁止商业用…...

深入理解 JSX:React 的核心语法

1. 什么是 JSX&#xff1f; JSX&#xff08;JavaScript And XML&#xff09;是 React 中最核心的概念之一&#xff0c;也是区别于 Vue 的一个重要特征&#xff08;尽管 Vue 现在也支持 JSX 语法&#xff09;。JSX 是一种在 JavaScript 中编写 HTML 代码片段的语法协议&#xf…...

工厂方法模式深度解析:从原理到应用实战

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…...

TS 星际通信指南:从 TCP 到 UDP 的宇宙漫游

文章目录 一、计算机网络通信1、基本概念2、核心要素&#xff08;一&#xff09;终端设备&#xff08;二&#xff09;通信介质&#xff08;三&#xff09;网络协议 3、常用通信模型&#xff08;一&#xff09;OSI 七层模型&#xff08;理论框架&#xff09;&#xff08;二&…...

python可视化:端午假期旅游火爆原因分析

python可视化&#xff1a;端午假期旅游火爆原因分析 2025年的旅游市场表现强劲&#xff1a; 2025年端午假期全社会跨区域人员流动量累计6.57亿人次&#xff0c;日均2.19亿人次&#xff0c;同比增长3.0%。入境游订单同比大涨近90%&#xff0c;门票交易额&#xff08;GMV&#…...

Missashe考研日记—Day51-Day57

Missashe考研日记—Day51-Day57 写在面前 本系列博客用于记录博主一周的学习进度。线代题型总结 专业课408 这周简直是拼命学计网&#xff0c;花了两三天速通传输层和应用层内容&#xff0c;又臭又长的网课听不下去一点了&#xff0c;赶紧结束准备开二轮进行复习和刷题了。…...

electron-vite_18桌面共享

electron默认不支持桌面共享&#xff0c;需要添加desktopCapturer配置&#xff0c;这样在使用navigator.mediaDevices.getUserMedia API访问可用于从桌面捕获音频和视频的媒体源的信息。 electron版本 "electron": "^31.0.2",在main.js中添加desktopCaptu…...

SOC-ESP32S3部分:28-BLE低功耗蓝牙

飞书文档https://x509p6c8to.feishu.cn/wiki/CHcowZMLtiinuBkRhExcZN7Ynmc 蓝牙是一种短距的无线通讯技术&#xff0c;可实现固定设备、移动设备之间的数据交换&#xff0c;下图是一个蓝牙应用的分层架构&#xff0c;Application部分则是我们需要实现的内容&#xff0c;Protoc…...

Git-flow流

Git git是版本控制软件&#xff0c;一般用来做代码版本控制 github是一个免费版本控制仓库是国内外很多开源项目的集中地&#xff0c;其本体是一个git服务器 Git初始化操作 git init 初始化仓库 git status 查看当前仓库的状态 git add . 将改动的文件加到暂存区 gi…...

VirtualBox给Rock Linux9.x配置网络

写这篇文章之前&#xff0c;先说明一下&#xff0c;我参考的是我之前写的《VirtualBox Linux网络配置》 我从CentOS7转到了Rock9&#xff0c;和配置Centos7一样&#xff0c;主流程没有变化&#xff0c;变化的是Rock9.x中的配置文件和使用的命令。 我再说一次&#xff0c;因为主…...

知识图谱增强的大型语言模型编辑

https://arxiv.org/pdf/2402.13593 摘要 大型语言模型&#xff08;LLM&#xff09;是推进自然语言处理&#xff08;NLP&#xff09;任务的关键&#xff0c;但其效率受到不准确和过时知识的阻碍。模型编辑是解决这些挑战的一个有前途的解决方案。然而&#xff0c;现有的编辑方法…...

.NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想

在当今数据驱动的时代&#xff0c;向量数据库&#xff08;Vector Database&#xff09;作为一种新兴的数据库技术&#xff0c;正逐渐成为软件开发领域的重要组成部分。特别是在 .NET 生态系统中&#xff0c;向量数据库的应用为开发者提供了构建智能、高效应用程序的新途径。 一…...

【claude+deepseek+gemini】基于李群李代数和螺旋理论工业机器人控制系统软件UI设计

claude的首次设计html是最佳的。之后让deepseek和gemini根据claude的UI设计进行改进设计。。。当然可以尝试很多次&#xff0c;也可以让他们之间来回不断改进…… claude deepseek-r1 0528 上图为deepseek首次设计&#xff0c;下面为改进设计 …… Gemini 2.5 Pro 0506 &#x…...

阿里云国际站,如何通过代理商邀请的链接注册账号

阿里云国际站&#xff1a;如何通过代理商邀请链接注册&#xff0c;解锁“云端超能力”与专属福利&#xff1f; 渴望在全球化浪潮中抢占先机&#xff1f;想获得阿里云国际站的海量云资源、遍布全球的加速节点与前沿AI服务&#xff0c;同时又能享受专属折扣、VIP级增值服务支持或…...