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)