xref: /aosp_15_r20/external/kotlinpoet/docs/constructors.md (revision 3c321d951dd070fb96f8ba59e952ffc3131379a0)
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