jface databinding:UpdateValueStrategy(数值更新策略)类详解

时间:2022-06-22
本文章向大家介绍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.ERRORIStatus.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(后续再专门撰文说这个问题)。