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即使我不能在构造函数中初始化它?

3 Solutions collect form web for “Kotlin – 如何使外部类只读字段”

要限制外部类的访问,可以更改访问者的可见性。 对于你的情况,你需要使用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不是一个有效的语句。 我们不能把值赋给函数的返回值。

您可以独立于实际variables修改getters / setters的可见性:

 lateinit var network: INetwork private set 

val network: INetwork by lazy { ... }适合您的情况吗?

lambdaexpression式被第一个引用的字段network调用。 很显然,这与推迟OnCreate方法的初始化并不相同,但它是一种使val不需要在构造函数中初始化的方法。

还有其他代表团的选择。 Kotlin文档值得检查。

Kotlin language will be the best programming language for Android.