gpt4 book ai didi

variables - 有没有一种更简洁的方法可以稍后在代码中设置顶级变量而不使其成为 lateinit var?

转载 作者:行者123 更新时间:2023-12-02 13:30:52 26 4
gpt4 key购买 nike

所以我想要实现的是稍后在主函数中设置顶级变量,但我不想让它成为一个肯定会破坏 Extension 的 lateinit var可变功能。

例如,此代码不起作用,因为扩展变量不支持 lateinit 修饰符:

lateinit var Dispatchers.Konvironment: MainCoroutineDispatcher
private set

fun main() {
...
Dispatchers.Konvironment = ArbitraryMainDispatcher(Thread.currentThread()) { queue.add(it) }
...
}

所以我最终想出的是使用一个虚拟变量并实现 val 变量的getter。

val Dispatchers.Konvironment: MainCoroutineDispatcher
get() = dispatcher

private lateinit var dispatcher: MainCoroutineDispatcher

fun main() {
...
dispatcher = ArbitraryMainDispatcher(Thread.currentThread()) { queue.add(it) }
...
}

但这肯定不是干净的方法。在顶层结构中创建多个变量看起来很难看(ish),这不是很干净的架构。

那么有没有可能的干净解决方法?有点像延迟初始化,由一些委托(delegate)或其他东西。

最佳答案

好吧,部分回答你的问题:

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 语法糖,它们将扩展类的实例作为参数之一,并执行一些操作。如果您熟悉 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);
}
}

从上面可能得出的结论是,扩展实际上并没有向扩展类的签名添加任何东西,它们只是用额外的功能来装饰它们。或者,如 docs 中所述:

Extensions do not actually modify classes they extend. By defining an extension, you do not insert new members into a class, but merely make new functions callable with the dot-notation on variables of this type.



所以你可以看到,除非 dispatcher不知何故已经存在于 Dispatchers ,如果不提供一个外部的“支持”变量,您就无法做您想做的事情,该变量的值可以被扩展实际引用。

关于variables - 有没有一种更简洁的方法可以稍后在代码中设置顶级变量而不使其成为 lateinit var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61458496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com