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