我是否需要在Kotlin中为val变量添加get()?

时间:2020-05-27 02:17:08

标签: kotlin

代码A来自LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case)

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
    }
}

2 个答案:

答案 0 :(得分:2)

是的,这里不需要get()

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

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

答案 1 :(得分:1)

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