Kotlin - 如何为外部类创建字段只读

Tia*_*ago 10 field readonly kotlin kotlin-lateinit

我在Android上有以下Kotlin类:

class ThisApplication: Application() {

    lateinit var network: INetwork

    override fun onCreate() {

        super.onCreate()

        network = Network()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,任何外部类都可以通过简单地执行以下操作来获取INetwork参考:

application.network
Run Code Online (Sandbox Code Playgroud)

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

application.network = myNewNetworkReference
Run Code Online (Sandbox Code Playgroud)

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

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

private lateinit var network: INetwork
fun getNetwork() = network
Run Code Online (Sandbox Code Playgroud)

但是,无论谁调用getNetwork()仍然可以为其分配一个新值,如下所示:

application.getNetwork() = myNewNetworkReference
Run Code Online (Sandbox Code Playgroud)

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

Bak*_*aii 20

要限制外部类的访问,可以更改访问者的可见性.对于您的情况,您需要使用修饰符的privatesetter和publicgetter lateinit:

lateinit var network: INetwork
    private set
Run Code Online (Sandbox Code Playgroud)

或者是只读的懒惰属性:

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

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

private lateinit var network: INetwork
fun getNetwork() = network
Run Code Online (Sandbox Code Playgroud)

科特林是通过按值作为什么Java那样.所以,application.getNetwork() = myNewNetworkReference这不是一个有效的陈述.我们不能为函数的返回值赋值.


Kis*_*kae 10

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

lateinit var network: INetwork
    private set
Run Code Online (Sandbox Code Playgroud)