我正在使用JavaPoet生成给定字段列表的类。
生成一个构造函数,该构造函数将此字段列表转换为参数列表非常简单,如下所示:
val constructor = MethodSpec.constructorBuilder()
for ((fieldName, typeName) <- fields) {
constructor.addParameter(typeName, fieldName)
}
我还想生成一个静态方法,该方法实例化生成的类的新对象,这需要我生成一个使用上述字段列表的代码块。
目前,我正在通过以下方式实现这一点:
method
.addStatement(s"return new $$T(${fields.map(_._1).mkString(", ")})", className)
它有效,但我想知道是否有一种更"惯用"的方式来使用 JavaPoet 构建具有内置模板支持的参数列表。
为了避免混合 Scala 的插值和 JavaPoet 的模板,实现此目的的最佳方法是创建一个包含参数列表的CodeBlock
,并使用模板将其嵌入到代码中,如以下示例所示:
val params = fields.map { case (name, _) => CodeBlock.of(name) }
val paramList = CodeBlock.join(params.asJava)
method.addStatement("return new $T($L)", className, paramList)
此处的模板使用$L
占位符,该占位符将被文本(在本例中为参数组合列表)替换。