gpt4 book ai didi

field - Kotlin - 如何使外部类的字段只读

转载 作者:IT老高 更新时间:2023-10-28 13:35:29 31 4
gpt4 key购买 nike

我在 Android 上有以下 Kotlin 类:

class ThisApplication: Application() {

lateinit var network: INetwork

override fun onCreate() {

super.onCreate()

network = Network()
}
}

现在,任何外部类都可以通过简单的操作来获取 INetwork 引用:

application.network

但是,这也使得外部类可以覆盖该值:

application.network = myNewNetworkReference

我想避免第二种选择。不幸的是,我无法创建字段 val,因为它的初始化需要在 onCreate 回调中进行。

我还考虑过将字段设为私有(private)并通过函数将其公开,如下所示:

private lateinit var network: INetwork
fun getNetwork() = network

但是,调用 getNetwork() 的人仍然可以为其分配新值,如下所示:

application.getNetwork() = myNewNetworkReference

如何使外部类的网络字段为只读?或者更好的是,有没有办法让它 val 即使我无法在构造函数中初始化它?

最佳答案

要限制来自外部类的访问,您可以更改访问器的可见性。对于您的情况,您需要带有 lateinit 修饰符的 private setter 和 public getter:

lateinit var network: INetwork
private set

或者一个只读的惰性属性:

val network: INetwork by lazy { Network() }  //you can access private property here, eg. applicationContext

您对这段代码有一些误解:

private lateinit var network: INetwork
fun getNetwork() = network

Kotlin 是 按值传递 就像 Java does .因此,application.getNetwork() = myNewNetworkReference 不是一个有效的语句。我们不能为函数的返回值赋值。

关于field - Kotlin - 如何使外部类的字段只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45777304/

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