jface databinding:UpdateValueStrategy(数值更新策略)类详解
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/53857624
在jface databinding(数据绑定框架)中,org.eclipse.core.databinding.UpdateValueStrategy 类(数值更新策略)是个比较重要的类,通过了解它可以更容易理解数据绑定的整个框架,起到提纲挈领的作用。 这个类的作用是定义被绑定的源/目标两个可观察值(observable value)之间数据更新、验证、转换的方式。
数据更新步骤
被绑定的源/目标两个可观察值(observable value)数据之间的数据更新步骤分为:
步骤 |
实现方法 |
指定验证器/转换器 |
---|---|---|
1.用getter方法获取源观察值(observable value)数据后验证 |
validateAfterGet(Object) |
setAfterGetValidator(IValidator) |
2.数据转换 |
convert(Object) |
setConverter(IConverter) |
3.数据转换后验证 |
validateAfterConvert(Object) |
setAfterConvertValidator(IValidator) |
4.调用setter方法修改数据之前验证 |
validateBeforeSet(Object) |
setBeforeSetValidator(IValidator) |
5.调用setter方法修改目标观察值(observable value)数据 |
doSet(IObservableValue,Object) |
关于数据更新的细节,可以参考
void org.eclipse.core.databinding.ValueBinding.doUpdate(IObservableValue, IObservableValue, UpdateValueStrategy, boolean, boolean)
方法的源码,数据更新的各个步骤就是在这个方法里一步步执行的。 org.eclipse.core.databinding.ValueBinding不是public类,online的javaDoc上找不到,所以请看源码
数据验证
数据验证器(IValidator)用于验证数据的有效性, 从上面的步骤可以看到,1,3,4都是数据验证过程,用于验证提交给下一步骤的数据的有效性(最重要且常用的是1),每次验证都会将验证结果以状态(IStatus)对象的形式返回(验证通过则状态为IStatus.OK),状态为IStatus.ERROR或IStatus.CANCEL时则终止更新过程。
关于验证器和转换器的使用参见我之前的博客 《jface databinding(数据挷定)中的数据转换(IConverter)和数据验证(IValidator )》
数据转换
数据转换器(IConverter)用于完成被绑定的两个可观察值(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(后续再专门撰文说这个问题)。
- MVC发布后项目存在于根目录中的子目录中时的css与js、图片路径问题
- ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射
- View与Control间的数据交互
- C#中Dispose和Close的区别!
- C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
- 你真的会玩SQL吗?查询指定节点及其所有父节点的方法
- ASP.Net MVC框架配置与分析
- MVC利用MvcHtmlString在后台生成HTML
- ExtJs学习笔记(7)_获取GridPanel选中行的详细信息
- ExtJs学习笔记(5)_Ajax示例
- shell脚本之特殊符号总结性梳理
- Centos6.X 下安装并使用VNC的操作记录
- Linux系统是否被植入木马的排查流程梳理
- 添加php的memcached扩展模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL复制全解析 Part 7 gtid_next和gtid_purged系统变量解析
- MySQL复制全解析 Part 8 GTID Auto-Positioning
- 红队之windows用户和组
- MySQL 复制全解析 Part10 基于GTID的MySQL复制的一些限制
- MySQL 复制全解析 Part 11 使用xtrabackup建立MySQL复制
- windows之NTLM认证
- 3A之自动白平衡(AWB)篇
- 欧拉角旋转
- matplotlib中文乱码的两种解决方案
- MySQL MHA部署 Part 3 MHA软件安装
- 自然语言处理的基本要义:向量表示法
- MySQL MHA部署 Part 4 MHA部署前准备
- 【NPM库】- 0x04 - Mock Data
- docker上部署MySQL实例
- Tomcat 高并发之道原理拆解与性能调优