xref: /aosp_15_r20/external/kotlinpoet/docs/anonymous-inner-classes.md (revision 3c321d951dd070fb96f8ba59e952ffc3131379a0)
1*3c321d95SSadaf EbrahimiAnonymous Inner Classes
2*3c321d95SSadaf Ebrahimi=======================
3*3c321d95SSadaf Ebrahimi
4*3c321d95SSadaf EbrahimiIn the enum code, we used `TypeSpec.anonymousClassBuilder()`. Anonymous inner classes can also be
5*3c321d95SSadaf Ebrahimiused in code blocks. They are values that can be referenced with `%L`:
6*3c321d95SSadaf Ebrahimi
7*3c321d95SSadaf Ebrahimi```kotlin
8*3c321d95SSadaf Ebrahimival comparator = TypeSpec.anonymousClassBuilder()
9*3c321d95SSadaf Ebrahimi  .addSuperinterface(Comparator::class.parameterizedBy(String::class))
10*3c321d95SSadaf Ebrahimi  .addFunction(
11*3c321d95SSadaf Ebrahimi    FunSpec.builder("compare")
12*3c321d95SSadaf Ebrahimi      .addModifiers(KModifier.OVERRIDE)
13*3c321d95SSadaf Ebrahimi      .addParameter("a", String::class)
14*3c321d95SSadaf Ebrahimi      .addParameter("b", String::class)
15*3c321d95SSadaf Ebrahimi      .returns(Int::class)
16*3c321d95SSadaf Ebrahimi      .addStatement("return %N.length - %N.length", "a", "b")
17*3c321d95SSadaf Ebrahimi      .build()
18*3c321d95SSadaf Ebrahimi  )
19*3c321d95SSadaf Ebrahimi  .build()
20*3c321d95SSadaf Ebrahimi
21*3c321d95SSadaf Ebrahimival helloWorld = TypeSpec.classBuilder("HelloWorld")
22*3c321d95SSadaf Ebrahimi  .addFunction(
23*3c321d95SSadaf Ebrahimi    FunSpec.builder("sortByLength")
24*3c321d95SSadaf Ebrahimi      .addParameter("strings", List::class.parameterizedBy(String::class))
25*3c321d95SSadaf Ebrahimi      .addStatement("%N.sortedWith(%L)", "strings", comparator)
26*3c321d95SSadaf Ebrahimi      .build()
27*3c321d95SSadaf Ebrahimi  )
28*3c321d95SSadaf Ebrahimi  .build()
29*3c321d95SSadaf Ebrahimi```
30*3c321d95SSadaf Ebrahimi
31*3c321d95SSadaf EbrahimiThis generates a method that contains a class that contains a method:
32*3c321d95SSadaf Ebrahimi
33*3c321d95SSadaf Ebrahimi```kotlin
34*3c321d95SSadaf Ebrahimiclass HelloWorld {
35*3c321d95SSadaf Ebrahimi  fun sortByLength(strings: List<String>) {
36*3c321d95SSadaf Ebrahimi    strings.sortedWith(object : Comparator<String> {
37*3c321d95SSadaf Ebrahimi      override fun compare(a: String, b: String): Int = a.length - b.length
38*3c321d95SSadaf Ebrahimi    })
39*3c321d95SSadaf Ebrahimi  }
40*3c321d95SSadaf Ebrahimi}
41*3c321d95SSadaf Ebrahimi```
42*3c321d95SSadaf Ebrahimi
43*3c321d95SSadaf EbrahimiOne particularly tricky part of defining anonymous inner classes is the arguments to the superclass
44*3c321d95SSadaf Ebrahimiconstructor. To pass them use `TypeSpec.Builder`'s `addSuperclassConstructorParameter()` method.
45