此处的代码通过使用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
答案 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
存储在该字段中。因此,有两个字段存储相同的值。在这种情况下,除了使用更多的内存外,这没有什么区别,但是在其他情况下,它可以:
如果_showProgress
是var
,则可以在构造后重新分配它。然后,如果showProgress
是用get()
定义的,对其进行访问将始终获得_showProgress
的当前值,但是如果没有get()
,它将获得初始值。
类似地,如果_showProgress
是open protected
并在子类中被覆盖(由于初始化顺序)。