生成对具有可变数量参数的方法的调用

Generate a call to a method with a variable number of arguments

我正在使用 JavaPoet 生成给定字段列表的 classes。

生成一个采用此字段列表并将其转换为参数列表的构造函数非常简单,如下所示:

val constructor = MethodSpec.constructorBuilder()
for ((fieldName, typeName) <- fields) {
  constructor.addParameter(typeName, fieldName)
}

我还想生成一个实例化生成的新对象的静态方法class,这需要我生成一个使用上述字段列表的代码块。

目前,我正在通过以下方式实现这一目标:

method
  .addStatement(s"return new $$T(${fields.map(_._1).mkString(", ")})", className)

它有效,但我想知道是否有更多 "idiomatic" 方法来使用 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 占位符,该占位符将被替换为文字(在本例中为组装的参数列表)。