The Companions to Come
TL;DR · AI 摘要
The Companions to Come - The JetBrains Blog Kotlin A concise multiplatform language developed by JetBrains Follow - Foll...
核心要点
- 主题聚焦:The Companions to Come
- 来源:The JetBrains Blog,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
即将到来的伴随机制 - JetBrains 博客
Kotlin
JetBrains 开发的简洁多平台语言
关注
- 关注:
- X X
- RSS RSS
访问 Kotlin 官网
Kotlin
新闻
即将到来的伴随机制
Alejandro Serrano Mena
我们正在扩展伴随机制的功能,以解锁新的代码模式并提升跨平台互操作性。本文概述了这些新特性,并提供迁移的初步指导。
伴随块与扩展
许多编程语言提供了类或类型成员的概念——这些功能不属于类的每个具体值,而是属于类本身。常量、工具方法和工厂方法通常属于此类。
val v1 = Vector(1.0, 2.0) // 一个普通向量
val v2 = Vector.ZERO // 零向量常量
val v3 = Vector.unit(angle = PI / 2) // 带角度的单位向量此前,我们使用伴随对象来定义这些成员。从 Kotlin 2.5.0 开始,您还可以使用实验性的伴随块,其语法与伴随对象非常相似,但在编译方式上存在根本性差异。
data class Vector(val x: Double, val y: Double) {
companion {
val ZERO = Vector(0.0, 0.0)
}
}实际上,这些成员可能并不直接定义在类本身上。您还可以使用实验性的伴随扩展,在类型中声明新的类成员,即使您不控制该类型。
companion fun Vector.unit(angle: Double) = Vector(cos(angle), sin(angle))伴随块和扩展的设计克服了伴随对象的限制。首先,您可以为任何类或接口定义伴随扩展——无论您是否控制该类型,无论它最初是来自 Kotlin 还是 Java,无论它是否有伴随对象。其次,编译策略与其他平台的静态成员类似。例如,在 JVM 上,伴随块会被编译为静态成员。这对 Kotlin 多平台有额外影响:现在您可以定义预期的伴随块成员,并通过包含静态成员的 Java 类来实现它们。
如果想了解更多关于这个即将推出的语言特性,对应的 KEEP 提案包含所有相关信息。
使用实验性伴随机制
伴随块和扩展是 Kotlin 2.5.0 中的实验性特性。这意味着您需要传递额外的编译器标志来使用该特性:
- -Xcompanion-blocks 用于启用伴随块。
- -Xcompanion-blocks-and-extensions 用于同时启用伴随块和扩展。
使用第二个特性会导致编译器生成预发布二进制文件,这意味着使用伴随扩展的库在该特性稳定之前可能无法作为依赖项使用。此限制不适用于暴露伴随块,但使用这些块的消费者仍需要启用伴随块特性。
我的伴随对象怎么办?
这引发了一个自然的问题:在具有伴随块和扩展的语言中,伴随对象的作用是什么?对此问题有两个答案:
- 一方面,大多数伴随对象的用法都可以通过伴随块更好地实现,因此新代码可能更倾向于使用伴随块而非伴随对象。
- 另一方面,有一些使用场景只能通过伴随对象来实现。例如,如果伴随对象需要实现特定的接口,伴随对象是唯一的选择,因为它们会编译为完整的类。
不过无需迁移。伴随对象是 Kotlin 的重要组成部分,对其的支持得到了完全保证。
如果倾向于转向伴随块,在大多数情况下只需移除 object 关键字即可 – 但请注意,项目及其依赖的代码都需要重新编译。生态系统中的其他工具可能尚未准备好支持伴随块,尽管我们正在努力确保主要工具尽快提供这种支持。
- 分享
上一篇帖子
2026 年 Kotlin 状态报告 /think