Kotlin – 如何使外部类只读字段
我在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 lateinit var network: INetwork fun getNetwork() = network
但是,调用getNetwork()的人仍然可以为它分配一个新的值,如下所示:
application.getNetwork() = myNewNetworkReference
我怎样才能使网络领域只读的外部类? 或者甚至更好,是否有一种方法来使其val
即使我不能在构造函数中初始化它?
要限制外部类的访问,可以更改访问者的可见性。 对于你的情况,你需要使用lateinit
修饰符的private
setter和public
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
像Java一样, Kotlin是通过价值传递的 。 所以, application.getNetwork() = myNewNetworkReference
不是一个有效的语句。 我们不能把值赋给函数的返回值。
您可以独立于实际变量修改getters / setters的可见性:
lateinit var network: INetwork private set
val network: INetwork by lazy { ... }
适合您的情况吗?
lambda表达式被第一个引用的字段network
调用。 很显然,这与推迟OnCreate
方法的初始化并不相同,但它是一种使val
不必在构造函数中进行初始化的方法。
还有其他代表团的选择。 Kotlin文档值得检查。