我需要为 Kotlin 中的 val 变量添加 get() 吗?



代码 A 来自文章 LiveData with SnackBar、Navigation and Other event(SingleLiveEvent 案例(。

navigateToDetails是 val 变量,所以我认为代码 B 可以做同样的工作,对吗?

代码 A

class ListViewModel : ViewModel {
private val _navigateToDetails = MutableLiveData<Event<String>>()    
val navigateToDetails : LiveData<Event<String>>  get() = _navigateToDetails
fun userClicksOnButton(itemId: String) {
_navigateToDetails.value = Event(itemId)  // Trigger the event by setting a new Event as a new value
}
}

代码 B

class ListViewModel : ViewModel {
private val _navigateToDetails = MutableLiveData<Event<String>>()    
val navigateToDetails : LiveData<Event<String>> = _navigateToDetails
fun userClicksOnButton(itemId: String) {
_navigateToDetails.value = Event(itemId)  // Trigger the event by setting a new Event as a new value
}
}

是的,这里不需要get()

添加get()会导致每次访问属性时重新计算=后面的表达式。在这种情况下,它只是指向只读属性,因此无论如何它每次都会以相同的方式计算。如果表达式指向可变属性,或者可能是基于某些可变属性的when语句,则可能需要使用显式 getter,以便在对象状态更改时更改基础值。相反,如果您只希望在初始化期间计算一次表达式,然后无论如何始终返回相同的值,则您不希望定义 getter。

请注意,get() =get() { /* ... */ }的简写,类似于编写单表达式函数时可以使用的简写。get()意味着您正在为属性定义一个 getter 函数。裸=意味着您在初始化期间为支持字段分配一个值。

get()的要点很小,但它存在;代码 B 在两个字段中存储相同的引用,因此为此类的每个实例使用更多的内存。当然,在这种情况下,ListViewModel的情况可能很少,因此在实践中不太可能重要。

最新更新