我在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/