我在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吗?

最佳答案

要限制来自外部类的访问,可以更改访问器的可见性。对于您的情况,您需要使用private修饰符的public setter和lateinit 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/

10-10 09:54