能否从Groovy调用带具名参数的Kotlin函数(含copy方法)?
在Groovy中以具名参数方式调用Kotlin函数的实践探索
背景
基于Kotlin代码库,使用Spock/Groovy编写测试场景下,若能通过参数名调用带默认参数的Kotlin函数会大幅提升测试代码的便捷性,尤其适合实体类的测试构建器场景。
给定的Kotlin代码
data class User( val id: Id, val name: String, val emailAddress: String, ) fun buildUser( id: Id = randomId(), name: String = randomName(), emailAddress: String = randomEmailAddress(), ): User
期望的Groovy调用方式
User user = buildUser( name: 'My name' )
实现方向与扩展需求
该需求具备可行性,可通过两种方向实现:
- Kotlin侧:借助编译器插件重载
buildUser函数,新增接收Map参数的版本 - Groovy侧:使用AST转换实现语法适配
目前是否已有成熟的相关实践方案?
此外,若该实现能延伸支持Kotlin data class的copy方法调用会更实用,例如:
User user = buildUser() User userWithDifferentEmailAddress = user.copy(emailAddress: 'me@example.com')
理想状态下希望IntelliJ IDEA能同步支持参数重命名、跳转等IDE特性,但这一要求可能存在较高的实现门槛。
反编译代码佐证(补充)
查看Kotlin代码反编译后的Java实现,生成了如下带默认参数处理的方法:
public static User buildUser$default(Id var0, String var1, String var2, int var3, Object var4) { // uses var3 as a flag to indicate which fields were provided by the caller } public static User copy$default(User var0, Id var1, String var2, String var3, int var4, Object var5) { // uses var4 as a flag to indicate which fields were provided by the caller }
从反编译结果来看,完全可以通过Groovy层面的适配实现目标调用方式。
内容的提问来源于stack exchange,提问作者Robert Elliot
相关产品推荐
相关产品推荐

