xref: /aosp_15_r20/external/kotlinpoet/docs/enums.md (revision 3c321d951dd070fb96f8ba59e952ffc3131379a0)
1*3c321d95SSadaf EbrahimiEnums
2*3c321d95SSadaf Ebrahimi=====
3*3c321d95SSadaf Ebrahimi
4*3c321d95SSadaf EbrahimiUse `enumBuilder` to create the enum type, and `addEnumConstant()` for each value:
5*3c321d95SSadaf Ebrahimi
6*3c321d95SSadaf Ebrahimi```kotlin
7*3c321d95SSadaf Ebrahimival helloWorld = TypeSpec.enumBuilder("Roshambo")
8*3c321d95SSadaf Ebrahimi  .addEnumConstant("ROCK")
9*3c321d95SSadaf Ebrahimi  .addEnumConstant("SCISSORS")
10*3c321d95SSadaf Ebrahimi  .addEnumConstant("PAPER")
11*3c321d95SSadaf Ebrahimi  .build()
12*3c321d95SSadaf Ebrahimi```
13*3c321d95SSadaf Ebrahimi
14*3c321d95SSadaf EbrahimiTo generate this:
15*3c321d95SSadaf Ebrahimi
16*3c321d95SSadaf Ebrahimi```kotlin
17*3c321d95SSadaf Ebrahimienum class Roshambo {
18*3c321d95SSadaf Ebrahimi  ROCK,
19*3c321d95SSadaf Ebrahimi
20*3c321d95SSadaf Ebrahimi  SCISSORS,
21*3c321d95SSadaf Ebrahimi
22*3c321d95SSadaf Ebrahimi  PAPER
23*3c321d95SSadaf Ebrahimi}
24*3c321d95SSadaf Ebrahimi```
25*3c321d95SSadaf Ebrahimi
26*3c321d95SSadaf EbrahimiFancy enums are supported, where the enum values override methods or call a superclass constructor.
27*3c321d95SSadaf EbrahimiHere's a comprehensive example:
28*3c321d95SSadaf Ebrahimi
29*3c321d95SSadaf Ebrahimi```kotlin
30*3c321d95SSadaf Ebrahimival helloWorld = TypeSpec.enumBuilder("Roshambo")
31*3c321d95SSadaf Ebrahimi  .primaryConstructor(
32*3c321d95SSadaf Ebrahimi    FunSpec.constructorBuilder()
33*3c321d95SSadaf Ebrahimi      .addParameter("handsign", String::class)
34*3c321d95SSadaf Ebrahimi      .build()
35*3c321d95SSadaf Ebrahimi  )
36*3c321d95SSadaf Ebrahimi  .addEnumConstant(
37*3c321d95SSadaf Ebrahimi    "ROCK", TypeSpec.anonymousClassBuilder()
38*3c321d95SSadaf Ebrahimi      .addSuperclassConstructorParameter("%S", "fist")
39*3c321d95SSadaf Ebrahimi      .addFunction(
40*3c321d95SSadaf Ebrahimi        FunSpec.builder("toString")
41*3c321d95SSadaf Ebrahimi          .addModifiers(KModifier.OVERRIDE)
42*3c321d95SSadaf Ebrahimi          .addStatement("return %S", "avalanche!")
43*3c321d95SSadaf Ebrahimi          .returns(String::class)
44*3c321d95SSadaf Ebrahimi          .build()
45*3c321d95SSadaf Ebrahimi      )
46*3c321d95SSadaf Ebrahimi      .build()
47*3c321d95SSadaf Ebrahimi  )
48*3c321d95SSadaf Ebrahimi  .addEnumConstant(
49*3c321d95SSadaf Ebrahimi    "SCISSORS", TypeSpec.anonymousClassBuilder()
50*3c321d95SSadaf Ebrahimi      .addSuperclassConstructorParameter("%S", "peace")
51*3c321d95SSadaf Ebrahimi      .build()
52*3c321d95SSadaf Ebrahimi  )
53*3c321d95SSadaf Ebrahimi  .addEnumConstant(
54*3c321d95SSadaf Ebrahimi    "PAPER", TypeSpec.anonymousClassBuilder()
55*3c321d95SSadaf Ebrahimi      .addSuperclassConstructorParameter("%S", "flat")
56*3c321d95SSadaf Ebrahimi      .build()
57*3c321d95SSadaf Ebrahimi  )
58*3c321d95SSadaf Ebrahimi  .addProperty(
59*3c321d95SSadaf Ebrahimi    PropertySpec.builder("handsign", String::class, KModifier.PRIVATE)
60*3c321d95SSadaf Ebrahimi      .initializer("handsign")
61*3c321d95SSadaf Ebrahimi      .build()
62*3c321d95SSadaf Ebrahimi  )
63*3c321d95SSadaf Ebrahimi  .build()
64*3c321d95SSadaf Ebrahimi```
65*3c321d95SSadaf Ebrahimi
66*3c321d95SSadaf EbrahimiWhich generates this:
67*3c321d95SSadaf Ebrahimi
68*3c321d95SSadaf Ebrahimi```kotlin
69*3c321d95SSadaf Ebrahimienum class Roshambo(private val handsign: String) {
70*3c321d95SSadaf Ebrahimi  ROCK("fist") {
71*3c321d95SSadaf Ebrahimi    override fun toString(): String = "avalanche!"
72*3c321d95SSadaf Ebrahimi  },
73*3c321d95SSadaf Ebrahimi
74*3c321d95SSadaf Ebrahimi  SCISSORS("peace"),
75*3c321d95SSadaf Ebrahimi
76*3c321d95SSadaf Ebrahimi  PAPER("flat");
77*3c321d95SSadaf Ebrahimi}
78*3c321d95SSadaf Ebrahimi```
79