跳到内容

匿名内部类

在枚举代码中,我们使用了 TypeSpec.anonymousClassBuilder()。匿名内部类也可以在代码块中使用。它们是可以通过 %L 引用的值。

val comparator = TypeSpec.anonymousClassBuilder()
  .addSuperinterface(Comparator::class.parameterizedBy(String::class))
  .addFunction(
    FunSpec.builder("compare")
      .addModifiers(KModifier.OVERRIDE)
      .addParameter("a", String::class)
      .addParameter("b", String::class)
      .returns(Int::class)
      .addStatement("return %N.length - %N.length", "a", "b")
      .build()
  )
  .build()

val helloWorld = TypeSpec.classBuilder("HelloWorld")
  .addFunction(
    FunSpec.builder("sortByLength")
      .addParameter("strings", List::class.parameterizedBy(String::class))
      .addStatement("%N.sortedWith(%L)", "strings", comparator)
      .build()
  )
  .build()

这会生成一个方法,该方法中包含一个类,该类中又包含一个方法

class HelloWorld {
  fun sortByLength(strings: List<String>) {
    strings.sortedWith(object : Comparator<String> {
      override fun compare(a: String, b: String): Int = a.length - b.length
    })
  }
}

定义匿名内部类的一个特别棘手的部分是传递给超类构造函数的参数。要传递它们,请使用 TypeSpec.BuilderaddSuperclassConstructorParameter() 方法。