在Kotlin中分配值时,get()会做什么?

时间:2018-12-01 21:03:47

标签: kotlin variable-assignment

此处的代码通过使用get()将_showProgress分配给showProgress

private val _showProgress = MutableLiveData<SingleLiveEventWrapper<Boolean>>()
override val showProgress : LiveData<SingleLiveEventWrapper<Boolean>>
    get() = _showProgress

这里的代码与上面的代码相同,并且运行代码时似乎没有什么区别,它的工作与上面的代码相同。上面的代码中的get()有什么作用?分配值时是否需要使用get()

private val _showProgress = MutableLiveData<SingleLiveEventWrapper<Boolean>>()
override val showProgress : LiveData<SingleLiveEventWrapper<Boolean>> = _showProgress

2 个答案:

答案 0 :(得分:1)

get()方法不会更改值,但是会更改 type 。 (仍然是静态的编译时类型。)

私有属性是一个MutableLiveData字段。我不知道这种类型,但它看起来像一个包装一些数据(在这种情况下为SingleLiveEventWrapper<Boolean>)并允许对其进行更改的类或接口。

不过,公共财产是LiveData。这可能是MutableLiveData的超类或超接口,它缺少允许更改数据的方法。覆盖的getter方法仅返回private属性的值,但这样做会将其向上转换为非可变类型。

结果是该类中的代码可以访问可变字段,而其他代码只能获得该字段的只读视图。因此,它有效地进行了一些封装,从而限制了更改字段的能力,同时仍然可以看到字段。

(您无需显式调用getter;只需使用属性语法myObject.showProgress即可为您调用getter。在Kotlin中,所有属性都具有getter方法-并且,如果{{1} }设置器;仅在需要其他行为时才需要覆盖默认设置。

答案 1 :(得分:1)

在gidds的答案上加了一点,并专门关注与

的比较
override val showProgress : LiveData<SingleLiveEventWrapper<Boolean>> = _showProgress

如果在没有显式获取程序的情况下使用= ...,则会在构造对象时创建一个后备字段并将_showProgress存储在该字段中。因此,有两个字段存储相同的值。在这种情况下,除了使用更多的内存外,这没有什么区别,但是在其他情况下,它可以:

  1. 如果_showProgressvar,则可以在构造后重新分配它。然后,如果showProgress是用get()定义的,对其进行访问将始终获得_showProgress的当前值,但是如果没有get(),它将获得初始值。

  2. 类似地,如果_showProgressopen protected并在子类中被覆盖(由于初始化顺序)。