我坚持使用此功能,下面是要生成的预期代码,参数总数不是修正号,可能有2个,或3个或更多。
val实例:InstanceType = Instance(parameter1,parameter2)
这是一个功能,所以我只知道我应该使用 .addCode(CodeBlock.of(“%L”,PropertySpec))
但是我没有找到一种方法来定义代码块,需要传递动态参数。有什么建议吗?
答案 0 :(得分:1)
有两种方法可以解决这个问题。首先,CodeBlock
有Builder
,允许您动态构建它。这是一个例子:
@Test fun manyParams() {
val instanceType = ClassName("", "InstanceType")
val instance = ClassName("", "Instance")
val params = listOf("param1", "param2")
val prop = PropertySpec.builder("instance", instanceType)
.initializer(CodeBlock.builder()
.add("%T(", instance)
.apply {
params.forEachIndexed { index, param ->
if (index > 0) add(",%W")
add(param)
}
}
.add(")")
.build())
.build()
assertThat(prop.toString()).isEqualTo("""
|val instance: InstanceType = Instance(param1, param2)
|""".trimMargin())
}
其次,您可以为每个参数创建单独的CodeBlock
并加入它们:
@Test fun manyParams() {
val instanceType = ClassName("", "InstanceType")
val instance = ClassName("", "Instance")
val params = listOf("param1", "param2")
val paramCodeBlocks = params.map { CodeBlock.of(it) }
val prop = PropertySpec.builder("instance", instanceType)
.initializer("%T(%L)", instance, paramCodeBlocks.joinToCode(separator = ",%W"))
.build()
assertThat(prop.toString()).isEqualTo("""
|val instance: InstanceType = Instance(param1, param2)
|""".trimMargin())
}