我们对 val 变量使用 get() 有什么原因吗?
我认为下面的代码是没有必要的
private val context: Context get() = ApplicationProvider.getApplicationContext<Context>()
所以我改成了
private val context: Context = ApplicationProvider.getApplicationContext<Context>()
对只读变量使用 get() 有什么不同?
最佳答案
您正在处理两种不同的属性声明方式:
具有支持字段的属性
如果您声明属性 context
并像这样分配它:
private val context: Context = ApplicationProvider.getApplicationContext<Context>()
您创建了一个 property with backing field .
ApplicationProvider.getApplicationContext<Context>()
在实例化类时评估一次。自 context
每次返回相同的值(由函数调用分配)时都是不可变的(val
)。
没有后备字段的属性
如果声明context
像这样
private val context: Context get() = ApplicationProvider.getApplicationContext<Context>()
您创建了一个没有支持字段的属性。 ApplicationProvider.getApplicationContext<Context>()
每次访问context
都会被评估. getter 返回的值可以根据函数的转发调用是否返回不同的内容而改变。
用什么?
因此,这取决于您的用例,但在这种特殊情况下,我建议您使用没有支持字段变体的属性,原因有二:
- 你不能确定
ApplicationProvider.getApplicationContext<Context>()
将始终返回相同的值,至少文档没有明确提及 - 转发函数调用不会对性能产生重大影响
关于android - Kotlin 将 getter 用于只读变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53910186/