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

在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(后续再专门撰文说这个问题)。

你可能感兴趣的:(java,ui,databinding)