博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jface databinding:UpdateValueStrategy(数值更新策略)类详解
阅读量:2173 次
发布时间:2019-05-01

本文共 2099 字,大约阅读时间需要 6 分钟。

在jface databinding(数据绑定框架)中, 类(数值更新策略)是个比较重要的类,通过了解它可以更容易理解数据绑定的整个框架,起到提纲挈领的作用。

这个类的作用是定义被绑定的源/目标两个可观察值()之间数据更新、验证、转换的方式。

数据更新步骤

被绑定的源/目标两个可观察值(observable value)数据之间的数据更新步骤分为:

步骤 实现方法 指定验证器/转换器
1.用getter方法获取源观察值(observable value)数据后验证
2.数据转换
3.数据转换后验证
4.调用setter方法修改数据之前验证
5.调用setter方法修改目标观察值(observable value)数据

关于数据更新的细节,可以参考void org.eclipse.core.databinding.ValueBinding.doUpdate(IObservableValue, IObservableValue, UpdateValueStrategy, boolean, boolean)方法的源码,数据更新的各个步骤就是在这个方法里一步步执行的。

org.eclipse.core.databinding.ValueBinding不是public类,online的javaDoc上找不到,所以请看源码

数据验证

数据验证器()用于验证数据的有效性,

从上面的步骤可以看到,1,3,4都是数据验证过程,用于验证提交给下一步骤的数据的有效性(最重要且常用的是1),每次验证都会将验证结果以状态()对象的形式返回(验证通过则状态为),状态为或时则终止更新过程。

关于验证器和转换器的使用参见我之前的博客

数据转换

数据转换器()用于完成被绑定的两个可观察值(observable value)之间源数据类型到目标数据类型的转换.

如果你没有调用setConverter方法指定数据转换器,UpdateValueStrategy会根据源/目标观察值(observable value)的数据类型尝试找到合适的转换器(如StringToNumberConverter,NumberToStringConverter)来做为默认转换器,对于简单数据类型(Integer,float,Date…,String),UpdateValueStrategy一般都能找到合适的转换器。
当你使用了默认的converter(没有指定converter),并且没有指定afterGetValidator时,UpdateValueStrategy也会自动找到合适的验证器(IValidator)来作为afterGetValidator的缺省值(参见UpdateValueStrategy.fillDefaults方法源码)(beforeSetValidator,afterConvertValidator没有缺省值);
当你指定了converter时,并且没有指定afterGetValidator时,UpdateValueStrategy就不管afterGetValidator了(为null)。这种情况下,因为没有Validator对从源观察值(observable value)获取(get)的数据进行验证,不合法的数据可能会导致converter在执行数据转换过程抛出异常。
所以为避免这个问题,如果你指定了converter,就必须指定afterGetValidator。
关于这部分逻辑的细节请参考源码。
如何看源码呢?
建议以UpdateValueStrategy.defaultedConverter成员变量(boolean)为线索,沿着该成员变量的调用层次结构查看以下方法的代码,很快就明白了。

UpdateValueStrategy.fillDefaults

UpdateValueStrategy.findValidator
DataBindingContext.bindValue

自动处理策略

当源观察值(observable value)改变时自动执行前述的更新步骤。可以通过UpdateValueStrategy构造函数中的updatePolicy参数设置更新策略 (比如: POLICY_NEVER, POLICY_CONVERT, POLICY_ON_REQUEST, POLICY_UPDATE). 默认的策略是POLICY_UPDATE;

总结

对于一般的简单数据类型(Integer,float,Date,String…),DataBindingContext干得挺好,已经帮我们做了很多事情,DataBindingContext.bindValue方法中有能力找到合适的转换器,所以我们一般并不需要指定转换器(IConverter)。

一般情况下,项目中真正要关注的是验证器(IValidator),对于步骤1,3,4中的这么多验证器,一般情况下1最重要,我们可以根据项目实际需求来定制自己的afterGetValidator(后续再专门撰文说这个问题)。

转载地址:http://efrzb.baihongyu.com/

你可能感兴趣的文章
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>