可观测委托与map委托原理详解
在上一次https://www.cnblogs.com/webor2006/p/11369333.html中学习了委托属性,然后它在实际中有四种使用情况:
接下来则学习一下另外两种属性委托的使用。
可观测属性委托(Observable):
先来看一下我们要使用的可观测属性的委托方法的定义:
所以咱们定久一个这个可观测的属性委托:
接着来完成这个lambda表达式参数,它接收三个参数并没有返回值,如下:
接下来咱们来调用一下:
接下来再来回过头读一读它的javadoc的说明:
其中该方法的返回值是:
下面对该接口进行了解一下,其实在之前已经接触过了,打开:
下面读一下它的javadoc:
对于这个observable方法是监听值改变之后的结果,那有没有能监听值改变之前做点东东的么?答案是有的,就是紧挨着observable()方法下面这个:
下面来读一下该方法的说明:
好,下面来试一下该方法:
下面对其进行总结一下:
Delegates.observable接收两个参数:初始值与修改处理器。
处理器会在我们每次对属性赋值时得到调用(在赋值完成之后被调用),处理器本身接收3个参数:被赋值的属性本身,旧的属性值与新的属性值。
Delegates.vetoable的调用时机与Delegates.observable相反,它是在对属性赋值之前被调用,根据Delegates.vetoable的返回结果是true还是false,来决定是否真正对属性进行赋值。
map属性委托【实际使用比较多】:
这是最后一种属性委托,map属性委托它是将属性存储到map中,一种常见的应用场景是将属性值存储到map当中。这通常出现在JSON解析或者一些动态行为。在这种情况中,你可以将map实例作为委托,作为类中属性的委托。
好,下面来看一下它是如何使用的:
接下来调用一下,这里需要构造一个Map对象,得用到一个mapof()函数,不过它的使用跟Java是有点区别的,具体如下:
注意:map中的key的名字要与类中的属性名字保持一致,如果不一致会怎么样,试试:
所以还是先将其还原一下,我们看目前都是给只读属性进行了委托:
那如果是读写属性,它又是如何来委托给map的呢?其实另外还有一个读写的map,下面使用一下:
好,看一下它跟Map有啥区别:
所以此时就不能让编译器来自动推断了,需要显示的指定好它的类型,如下:
所以这就是第一次遇到不能让编译器自动推断的情况,在实际开发中也会遇到类似的,接下来调用一下: