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

Kotlin - How to make field read-only for external classes

我在 Android 上有以下 Kotlin class:

class ThisApplication: Application() {

    lateinit var network: INetwork

    override fun onCreate() {

        super.onCreate()

        network = Network()
    }
}

现在,任何外部 class 只需执行以下操作即可获得 INetwork 引用:

application.network

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

application.network = myNewNetworkReference

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

我也考虑过将字段设为私有并通过函数公开它,如下所示:

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

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

application.getNetwork() = myNewNetworkReference

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

val network: INetwork by lazy { ... } 是否适合您的场景?

lambda 表达式在第一次引用字段 network 时被调用。显然,这与将初始化推迟到 OnCreate 方法不同,但它是一种无需在构造函数中初始化就可以实现 val 的方法。

还有其他委派选择。 The Kotlin documentation 值得一看。

您可以独立于实际变量修改 getters/setters 的可见性:

lateinit var network: INetwork
    private set

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

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 不是一个有效的陈述。我们不能为函数的 return 值赋值。