Your Site Title

kotlin builder

kotlin 使用命名良好的函数和 function literals with receiver, 可以实现type-safe builder Type-safe builders allow creating Kotlin-based domain-specific languages (DSLs)

DSLs需要范围控制, 使用@DslMarker

builder type inference

kotlin支持builder type inference, 对泛型构建很有用

fun addEntryToMap(baseMap: Map<String, Number>, additionalEntry: Pair<String, Int>?) {
   val myMap = buildMap {
       putAll(baseMap)
       if (additionalEntry != null) {
           put(additionalEntry.first, additionalEntry.second)
       }
   }
}

这代码中buildMap 没有明确的类型, 编译器通过putAllput推断出buildMap 类型.

创建自己的builder

  1. 1.7.0前需要开启builder类型推断-Xenable-builder-inference, 1.7.0后默认开启

  2. 需要接收者的lambda, 目前还不支持泛型接收者 fun buildList(builder: MutableList.() -> Unit) { ... }

  3. builder应该是类的成员函或者扩展函数.

Supported features:

构建推断是使用Postponed type variables工作的, 延迟类型变量是正在进行推断的类型参数的类型. 编译器 使用它来推断.

Contributing to builder inference results:

Reference