Kotlin - 如何使字段对外部只读 类
Kotlin - How to make field read-only for external classes
我在 Android 上有以下 Kotlin class:
class ThisApplication: Application() {
lateinit var network: INetwork
override fun onCreate() {
super.onCreate()
network = Network()
}
}
现在,任何外部 class 只需执行以下操作即可获得 INetwork 引用:
application.network
但是,这也使得外部 class 可以覆盖该值:
application.network = myNewNetworkReference
我想避免第二种选择。不幸的是,我无法创建字段 val
因为它的初始化需要在 onCreate
回调中进行。
我也考虑过将字段设为私有并通过函数公开它,如下所示:
private lateinit var network: INetwork
fun getNetwork() = network
但是,调用 getNetwork() 的任何人仍然可以为其分配一个新值,如下所示:
application.getNetwork() = myNewNetworkReference
如何使网络字段对外部 classes 只读?或者更好的是,有没有办法让它 val
即使我不能在构造函数中初始化它?
val network: INetwork by lazy { ... }
是否适合您的场景?
lambda 表达式在第一次引用字段 network
时被调用。显然,这与将初始化推迟到 OnCreate
方法不同,但它是一种无需在构造函数中初始化就可以实现 val
的方法。
还有其他委派选择。 The Kotlin documentation 值得一看。
您可以独立于实际变量修改 getters/setters 的可见性:
lateinit var network: INetwork
private set
要限制来自外部的访问 类,您可以更改访问者的可见性。对于您的情况,您需要 private
setter 和 public
getter 以及 lateinit
修饰符:
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
不是一个有效的陈述。我们不能为函数的 return 值赋值。
我在 Android 上有以下 Kotlin class:
class ThisApplication: Application() {
lateinit var network: INetwork
override fun onCreate() {
super.onCreate()
network = Network()
}
}
现在,任何外部 class 只需执行以下操作即可获得 INetwork 引用:
application.network
但是,这也使得外部 class 可以覆盖该值:
application.network = myNewNetworkReference
我想避免第二种选择。不幸的是,我无法创建字段 val
因为它的初始化需要在 onCreate
回调中进行。
我也考虑过将字段设为私有并通过函数公开它,如下所示:
private lateinit var network: INetwork
fun getNetwork() = network
但是,调用 getNetwork() 的任何人仍然可以为其分配一个新值,如下所示:
application.getNetwork() = myNewNetworkReference
如何使网络字段对外部 classes 只读?或者更好的是,有没有办法让它 val
即使我不能在构造函数中初始化它?
val network: INetwork by lazy { ... }
是否适合您的场景?
lambda 表达式在第一次引用字段 network
时被调用。显然,这与将初始化推迟到 OnCreate
方法不同,但它是一种无需在构造函数中初始化就可以实现 val
的方法。
还有其他委派选择。 The Kotlin documentation 值得一看。
您可以独立于实际变量修改 getters/setters 的可见性:
lateinit var network: INetwork
private set
要限制来自外部的访问 类,您可以更改访问者的可见性。对于您的情况,您需要 private
setter 和 public
getter 以及 lateinit
修饰符:
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
不是一个有效的陈述。我们不能为函数的 return 值赋值。