android - Kotlin 将 getter 用于只读变量

标签 android kotlin mockito robolectric

我们对 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 返回的值可以根据函数的转发调用是否返回不同的内容而改变。

用什么?

因此,这取决于您的用例,但在这种特殊情况下,我建议您使用没有支持字段变体的属性,原因有二:

  1. 你不能确定ApplicationProvider.getApplicationContext<Context>()将始终返回相同的值,至少文档没有明确提及
  2. 转发函数调用不会对性能产生重大影响

关于android - Kotlin 将 getter 用于只读变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53910186/

相关文章:

android - 如何结合 Navigation Drawer 和 Spinner [就像在 Google+ App 中一样]

android - Activity 的 onTouchEvent() 触发 3 次?

java - Mockito 在尝试对包私有(private)父类(super class)上实现的 stub 方法调用实际方法

java - 测试 spring mvc Controller

java - 如何简化测试?

java - 静态公共(public) boolean 值与公共(public)静态 boolean 值

android - 请推荐适用于 Android 的 2d 游戏/物理引擎

kotlin - 具有通用返回类型的高阶函数的类型推断

unit-testing - Kotlin 协程单元测试失败,错误为 "Module with the Main dispatcher had failed to initialize"

android - Auto Height Jetpack 组合线圈图像