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