Kotlin 2.4.0 正式发布,快来看看有哪些更新
昨日JetBrains 发布了Kotlin 2.4.0-Beta1。如果你管的是 Android 工具链、Kotlin 多平台或者团队里已经开始碰context receivers、注解处理、.klib兼容问题这个版本已经值得单独开分支验证。先说结论这次最有分量的变化不是单个 API而是 Kotlin 在三个方向同时推进• 语言层开始定型context parameters和注解 use-site target 相关特性正式稳定• 平台层继续对齐JVM 向Java 26走Native 向Swift Package Manager靠• 编译器层继续统一不同平台对 inline 的处理开始收敛语言层终于开始定型如果你这两年一直在关注 Kotlin 语言演进最容易感知到的信号就是context parameters。它在2.4.0-Beta1里转为稳定只有context arguments和 callable references 还没完全毕业。对于 DSL、Compose 风格 API、依赖注入、上下文感知扩展这类场景context parameters会比过去那套 receiver 叠加方式更清楚。如果你们团队之前试过context receivers现在就该重新看一眼迁移策略了。官方这次还加了一个实验能力显式传入context arguments。这不是为了“语法更酷”而是为了解决重载分派里的歧义问题。你们如果已经遇到“只差 context 参数就开始二义性”的情况这个方向就很实用。官方文档给的示例就很直接同一个sendNotification()可以在调用点明确指定要用哪套上下文class EmailSender class SmsSender context(emailSender: EmailSender)funsendNotification(){println(Sent email notification)}context(smsSender: SmsSender)funsendNotification(){println(Sent SMS notification)}context(defaultEmailSender: EmailSender, defaultSmsSender: SmsSender)funnotifyUser(){sendNotification(emailSenderdefaultEmailSender)sendNotification(smsSenderdefaultSmsSender)}如果你想提前试这个能力官方给的编译参数是kotlin{compilerOptions{freeCompilerArgs.add(-Xexplicit-context-arguments)}}标准库和 JVM没有花活但很落地标准库这次最容易直接上手的是UInt.toBigInteger()和ULong.toBigInteger()。以前从无符号整数转BigInteger很多项目都得自己绕一层字符串或者写辅助函数。现在这块总算补齐了代码会更直接也更少见“我只是想转个类型结果工具函数比业务还长”的尴尬。另一个新增能力是“判断是否已排序”的一组 API比如.isSorted()、.isSortedBy()。这类 API 看起来小但它非常适合放进集合校验、缓存命中判断、排序前短路和测试断言里。你们项目里有没有那种“为了确认顺序先sorted()一遍再比较”的代码这次可以顺手清掉一批了。官方文档里给了两组很典型的示例一组是无符号整数直转BigInteger一组是直接判断集合是否已经有序funmain(){val unsignedLongLong.MAX_VALUE.toULong() 1uL val unsignedIntUInt.MAX_VALUE println(unsignedLong.toBigInteger())//9223372036854775808println(unsignedInt.toBigInteger())//4294967295}data class User(val name: String, val age: Int)funmain(){val numberslistOf(1,2,3,4)println(numbers.isSorted())//truevaluserslistOf(User(Alice,24), User(Bob,31), User(Charlie,29),)println(users.isSortedBy(User::age))//false}JVM 侧则有两个明确信号。第一Kotlin 编译器开始支持生成Java 26字节码第二annotations in metadata 默认开启。前者说明 Kotlin/JVM 继续跟着 Java 版本节奏跑后者则更偏工具生态意义。Kotlin/Native开始更认真地接近 iOS 生态这次我认为最有方向感的更新其实在 Kotlin/Native。Kotlin Multiplatform现在可以把Swift packages作为 iOS 依赖写进 Gradle 配置了。对了昨天还发布了Swift 杀进 AndroidGoogle 和 Apple 都要失眠了感觉他们谁也不服谁。这意味着 KMP 团队以后在接入 iOS 侧能力时不一定非得先绕进 CocoaPods。对很多 iOS 团队来说Swift Package Manager才是今天更自然的依赖管理方式。Kotlin 现在主动去对齐这条生态路径本质上是在降低 KMP 和原生 iOS 协作的摩擦。如果你们团队之前就卡在“共享代码能跑但 iOS 依赖接入和维护特别别扭”这次更新很值得单独验证。它不一定立刻让所有 KMP 项目变简单但它至少说明官方正在补真正影响落地的问题而不是只补演示型能力。官方文档里的 Gradle 配置示例是这样的KMP 工程已经可以直接声明 Swift packagekotlin{swiftPMDependencies{swiftPackage(urlurl(https://github.com/firebase/firebase-ios-sdk.git), versionfrom(12.11.0), productslistOf(product(FirebaseAI), product(FirebaseAnalytics),))}}如果你们现在还靠 CocoaPods 兜底这段配置至少说明 Kotlin 官方想把 iOS 依赖接入往 SwiftPM 这条路上带。编译器这次给了一个很强的信号2.4.0-Beta1还做了一件技术上更深、但长期更关键的事.klib编译时的 inline 行为开始更一致。过去 Kotlin/JVM 会在编译期把 inline 函数直接展开但 Kotlin/Native、JS、Wasm 在.klib阶段的处理并不一样。结果就是同样叫 inline不同平台的兼容性保证并不完全等价。现在 Kotlin 先把“同模块内联”默认打开作为统一行为的第一步。这件事看上去很底层但它影响的是库发布、二进制兼容、调试预期以及多平台团队对 inline 的理解成本。如果你维护的是跨平台基础库而不是单个 App 页面这类变化就不能等到正式版再看了。官方文档给的例子也很直观同模块里的 inline 函数会在.klib生成时先展开跨模块的则留到后面的平台二进制阶段。// Existing logging.klib library inline fun logDebug(message: String){println([DEBUG]$message)}// Currently compiled App module inline fun greetUser(name: String){println(Hello,$name!)}funmain(){logDebug(App started)// Not inlined: declaredinanother module greetUser(Alice)// Inlined: declaredinthe same module}编译成.klib之后官方给出的伪代码大概会变成这样funmain(){logDebug(App started)val tmp0Aliceprintln(Hello,$tmp0!)}写在最后你们团队会现在就开分支试2.4.0-Beta1还是等 RC 再跟评论区聊聊你们最关心的是context parameters、SwiftPM还是.klib内联。[#Kotlin](javascript: [#Android开发](javascript: [#KMP](javascript: [#JetBrains](javascript: [#JVM](javascript: [#SwiftPM](javascript:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473986.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!