构造函数¶
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 会省略空主体的类的 {}
。