1*3c321d95SSadaf EbrahimiConstructors 2*3c321d95SSadaf Ebrahimi============ 3*3c321d95SSadaf Ebrahimi 4*3c321d95SSadaf Ebrahimi`FunSpec` is a slight misnomer; it can also be used for constructors: 5*3c321d95SSadaf Ebrahimi 6*3c321d95SSadaf Ebrahimi```kotlin 7*3c321d95SSadaf Ebrahimival flux = FunSpec.constructorBuilder() 8*3c321d95SSadaf Ebrahimi .addParameter("greeting", String::class) 9*3c321d95SSadaf Ebrahimi .addStatement("this.%N = %N", "greeting", "greeting") 10*3c321d95SSadaf Ebrahimi .build() 11*3c321d95SSadaf Ebrahimi 12*3c321d95SSadaf Ebrahimival helloWorld = TypeSpec.classBuilder("HelloWorld") 13*3c321d95SSadaf Ebrahimi .addProperty("greeting", String::class, KModifier.PRIVATE) 14*3c321d95SSadaf Ebrahimi .addFunction(flux) 15*3c321d95SSadaf Ebrahimi .build() 16*3c321d95SSadaf Ebrahimi``` 17*3c321d95SSadaf Ebrahimi 18*3c321d95SSadaf EbrahimiWhich generates this: 19*3c321d95SSadaf Ebrahimi 20*3c321d95SSadaf Ebrahimi```kotlin 21*3c321d95SSadaf Ebrahimiclass HelloWorld { 22*3c321d95SSadaf Ebrahimi private val greeting: String 23*3c321d95SSadaf Ebrahimi 24*3c321d95SSadaf Ebrahimi constructor(greeting: String) { 25*3c321d95SSadaf Ebrahimi this.greeting = greeting 26*3c321d95SSadaf Ebrahimi } 27*3c321d95SSadaf Ebrahimi} 28*3c321d95SSadaf Ebrahimi``` 29*3c321d95SSadaf Ebrahimi 30*3c321d95SSadaf EbrahimiFor the most part, constructors work just like methods. When emitting code, KotlinPoet will place 31*3c321d95SSadaf Ebrahimiconstructors before methods in the output file. 32*3c321d95SSadaf Ebrahimi 33*3c321d95SSadaf EbrahimiOften times you'll need to generate the primary constructor for a class: 34*3c321d95SSadaf Ebrahimi 35*3c321d95SSadaf Ebrahimi```kotlin 36*3c321d95SSadaf Ebrahimival helloWorld = TypeSpec.classBuilder("HelloWorld") 37*3c321d95SSadaf Ebrahimi .primaryConstructor(flux) 38*3c321d95SSadaf Ebrahimi .addProperty("greeting", String::class, KModifier.PRIVATE) 39*3c321d95SSadaf Ebrahimi .build() 40*3c321d95SSadaf Ebrahimi``` 41*3c321d95SSadaf Ebrahimi 42*3c321d95SSadaf EbrahimiThis code, however, generates the following: 43*3c321d95SSadaf Ebrahimi 44*3c321d95SSadaf Ebrahimi```kotlin 45*3c321d95SSadaf Ebrahimiclass HelloWorld(greeting: String) { 46*3c321d95SSadaf Ebrahimi private val greeting: String 47*3c321d95SSadaf Ebrahimi 48*3c321d95SSadaf Ebrahimi init { 49*3c321d95SSadaf Ebrahimi this.greeting = greeting 50*3c321d95SSadaf Ebrahimi } 51*3c321d95SSadaf Ebrahimi} 52*3c321d95SSadaf Ebrahimi``` 53*3c321d95SSadaf Ebrahimi 54*3c321d95SSadaf EbrahimiBy default, KotlinPoet won't merge primary constructor parameters and properties, even if they share 55*3c321d95SSadaf Ebrahimithe same name. To achieve the effect, you have to tell KotlinPoet that the property is initialized 56*3c321d95SSadaf Ebrahimivia the constructor parameter: 57*3c321d95SSadaf Ebrahimi 58*3c321d95SSadaf Ebrahimi```kotlin 59*3c321d95SSadaf Ebrahimival flux = FunSpec.constructorBuilder() 60*3c321d95SSadaf Ebrahimi .addParameter("greeting", String::class) 61*3c321d95SSadaf Ebrahimi .build() 62*3c321d95SSadaf Ebrahimi 63*3c321d95SSadaf Ebrahimival helloWorld = TypeSpec.classBuilder("HelloWorld") 64*3c321d95SSadaf Ebrahimi .primaryConstructor(flux) 65*3c321d95SSadaf Ebrahimi .addProperty( 66*3c321d95SSadaf Ebrahimi PropertySpec.builder("greeting", String::class) 67*3c321d95SSadaf Ebrahimi .initializer("greeting") 68*3c321d95SSadaf Ebrahimi .addModifiers(KModifier.PRIVATE) 69*3c321d95SSadaf Ebrahimi .build() 70*3c321d95SSadaf Ebrahimi ) 71*3c321d95SSadaf Ebrahimi .build() 72*3c321d95SSadaf Ebrahimi``` 73*3c321d95SSadaf Ebrahimi 74*3c321d95SSadaf EbrahimiNow we're getting the following output: 75*3c321d95SSadaf Ebrahimi 76*3c321d95SSadaf Ebrahimi```kotlin 77*3c321d95SSadaf Ebrahimiclass HelloWorld(private val greeting: String) 78*3c321d95SSadaf Ebrahimi``` 79*3c321d95SSadaf Ebrahimi 80*3c321d95SSadaf EbrahimiNotice that KotlinPoet omits `{}` for classes with empty bodies. 81