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