跳到内容

构造函数

FunSpec 有点名不副实;它也可以用于构造函数

val flux = FunSpec.constructorBuilder()
  .addParameter("greeting", String::class)
  .addStatement("this.%N = %N", "greeting", "greeting")
  .build()

val helloWorld = TypeSpec.classBuilder("HelloWorld")
  .addProperty("greeting", String::class, KModifier.PRIVATE)
  .addFunction(flux)
  .build()

它生成如下代码

class HelloWorld {
  private val greeting: String

  constructor(greeting: String) {
    this.greeting = greeting
  }
}

在大多数情况下,构造函数的工作方式与方法类似。在生成代码时,KotlinPoet 会将构造函数放在输出文件中的方法之前。

通常您需要为类生成主构造函数

val helloWorld = TypeSpec.classBuilder("HelloWorld")
  .primaryConstructor(flux)
  .addProperty("greeting", String::class, KModifier.PRIVATE)
  .build()

但是,此代码会生成以下内容

class HelloWorld(greeting: String) {
  private val greeting: String

  init {
    this.greeting = greeting
  }
}

默认情况下,KotlinPoet 不会合并主构造函数参数和属性,即使它们共享相同的名称。要达到此效果,您必须告知 KotlinPoet 该属性是通过构造函数参数初始化的

val flux = FunSpec.constructorBuilder()
  .addParameter("greeting", String::class)
  .build()

val helloWorld = TypeSpec.classBuilder("HelloWorld")
  .primaryConstructor(flux)
  .addProperty(
    PropertySpec.builder("greeting", String::class)
      .initializer("greeting")
      .addModifiers(KModifier.PRIVATE)
      .build()
  )
  .build()

现在我们得到以下输出

class HelloWorld(private val greeting: String)

请注意,KotlinPoet 会省略空主体的类的 {}