fake interface constructor.Как выглядит:
interface Foo {
fun foo()
}
fun Foo(): Foo = object : Foo {
override fun foo() {
println("foo")
}
}
fun main() {
val foo: Foo = Foo()
foo.foo()
}
Таким образом предоставляется только интерфейс наружу. Kotlin команда часто так делает, например
Job, CoroutineScope, CompletableDeferred, Channel, Mutex, Semaphore, MutableStateFlow, MutableSharedFlow, List именно так и реализованы. При инициализации вы обращаетесь к функции, что, например, сказывается на подсветке синтаксиса в IDE (вызов функции, а не обращение к конструктору)Зачем? Это дает свободу разработчикам подменять класс реализации без сложной и ломающей все миграции.
Из книги Marcin Moskała, Effective Kotlin
