Ну, частично ответив на ваш вопрос:
var Dispatchers.Konvironment: MainCoroutineDispatcher
get() = dispatcher
private set(value) {
dispatcher = value
}
private lateinit var dispatcher: MainCoroutineDispatcher
fun main() {
...
Dispatchers.Konvironment = ArbitraryMainDispatcher(Thread.currentThread()) { queue.add(it) }
...
}
даст вам желаемый способ присвоения значения. Однако нет способа избавиться от этой дополнительной переменной lazyinit
.
Расширения - это не более чем просто синтаксический сахар Kotlin для методов stati c, которые принимают экземпляр расширенного класса в качестве одного из аргументов и выполняют некоторое действие. Если вы знакомы с Java, то, например, эти расширения:
// Extensions.kt
fun Foo.extendedAction() {
println(this)
}
var Foo.extendedBar: Bar
get() = this.bar
set(value) {
this.bar = value
}
скрыты под этими методами в Java:
public class ExtensionsKt {
public static final void extendedAction(Foo foo) {
System.out.println(foo);
}
public static final Bar getExtendedBar(Foo foo) {
return foo.getBar();
}
public static final Bar setExtendedBar(Foo foo, Bar bar) {
foo.setBar(bar);
}
}
Заключение, которое может быть Из вышесказанного следует, что расширения на самом деле не добавляют ничего к сигнатурам расширенных классов, они просто украшают их дополнительными функциями. Или, как указано в документах :
Расширения, фактически не изменяют классы, которые они расширяют. Определяя расширение, вы не вставляете новые члены в класс, а просто делаете новые функции вызываемыми с помощью точечной нотации для переменных этого типа.
Таким образом, вы можете видеть, если только dispatcher
как-то уже существует в Dispatchers
, вы не можете делать то, что вы хотите, не предоставив внешнюю переменную «поддержки», на значение которой может ссылаться расширение.