jface databinding: 创建readonly(只读)可观察对象(observable)
来源:互联网 发布:vb打印99乘法表 编辑:程序博客网 时间:2024/05/22 06:29
java与C++有一点不同:C++有const关键字,使用const关键字,用于指定一个参数、成员变量或函数是只读不可修改的,通过const参数让对象成为readonly的,可以严格禁止外部调用修改对象的内容。而java没有类似的限制,只有一个final指定变量不可以被赋值,但还是可以通过调用变量的方法任意修改变量指向的对象内部状态。也就是说,java没有像C++那样有绝对readonly的限制。
但有的时候,对象向外部提供返回的值,并不希望外部调用者修改,怎么办呢?
对于以java.util.Collection<E>
为基类的对象(Map,Set,List….),java在java.util.Collections提供了一系列名字以unmodifiable为前缀的静态方法,可以创建指定Collection对象的一个副本,这个副本与原对象拥有相同的内容,但是只能读取,不可以修改,任何试图调用修改原对象内容的方法,都会抛出UnsupportedOperationException异常,这就有点像C++的const常量了。
以List为例:
List<Integer> list=new ArrayList<Integer>(); list.add(122); list.add(5); List<Integer> listReadOnly=java.util.Collections.unmodifiableList(list); for(Integer i:listReadOnly) System.out.println(i); // 可正常读取 listReadOnly.add(100)// 抛出 UnsupportedOperationException异常
java本身提供了Collection<E>
提供了创建readonly对象的方式,但是限制于java本身的机制,java并没有为普通的Object提供类似的普适的方法来创建readonly对象。
因为jface databinding本身的现实需求,jface 数据绑定技术中提供了对Observable对象的影子对象的创建方法。
比如,我们有时需要向外部提供一个Observable对象,以用于调用者观察这个对象的改变,但又不允许调用者修改对象,这时候,就不能把Observable对象直接提供给调用者,而是希望提供一个只读(readonly)的副本,或者叫影子对象,调用者可以通过这个影子对象感知真正的Observable对象的所有数据改变,但不能修改它,说白了—就是只许看不许摸。
下面是DataBindingContext的构造函数代码,就有这种影子对象的应用:
public DataBindingContext(Realm validationRealm) { Assert.isNotNull(validationRealm, "Validation realm cannot be null"); //$NON-NLS-1$ this.validationRealm = validationRealm; ObservableTracker.setIgnore(true); try { bindings = new WritableList(validationRealm); // 为bindings成员变量创建一个影子对象 unmodifiableBindings = Observables .unmodifiableObservableList(bindings); validationStatusProviders = new WritableList(validationRealm); // 为validationStatusProviders成员变量创建一个影子对象 unmodifiableStatusProviders = Observables .unmodifiableObservableList(validationStatusProviders); validationStatusMap = new ValidationStatusMap(validationRealm, bindings); } finally { ObservableTracker.setIgnore(false); } } // getBindings实际返回的是替身unmodifiableBindings,而不是bindings真身 public final IObservableList getBindings() { return unmodifiableBindings; } // getValidationStatusProviders实际返回的是替身unmodifiableStatusProviders,而不是validationStatusProviders真身 public final IObservableList getValidationStatusProviders() { return unmodifiableStatusProviders; }
从下面的类型层次结构图中可以看到,对于Map,Set,List以及普通的ObservableValue对象,jface都有对应的影子对象
调用org.eclipse.core.databinding.observable.Observables
中对应的静态方法,就可以为Observable对象创建对应的影子对象:
如下为一个String类型Observable对象name创建了对应的影子对象unmodifiableName
WritableValue<String> name = new WritableValue<String>(); IObservableValue<String> unmodifiableName = Observables.unmodifiableObservableValue(name);
如下为一个ObservableMap对象widgetBindings创建了对应的影子对象unmodifiableWidgetBindings
WritableMap<String,Binding> widgetBindings=new WritableMap<String,Binding>(); IObservableMap<String, Binding> unmodifiableWidgetBindings=Observables.unmodifiableObservableMap(widgetBindings);
- jface databinding: 创建readonly(只读)可观察对象(observable)
- Observable(可观察对象)
- jface databinding:List,Set,Map对象的Observable代理封装
- RxJS的秘密 Observable 可观察对象
- rxjs学习入门心得(一)Observable可观察对象
- Android DataBinding (三) Observable
- jface databinding/PojoBindable实现对POJO对象的支持
- jface databinding:部分实现POJO对象的监测
- WeX5--创建observable变量来绑定对象
- databinding 错误: * is not Observable
- Knockout 速率限制可观察通知(Rate-limiting observable notifications)
- Partially Observable Markov Decision Process部分可观察的马尔可夫决策过程
- 创建和订阅简单可观察序列
- 创建和查询可观察序列
- jface databinding: Radio Button group及ISideEffect绑定数据对象的例子
- jface databinding:使用CheckboxTableViewer实现表中(Set)对象与CheckTable中选中条目数据绑定
- 一个 只读 readonly 示例
- 为JFace(TableViewer,TreeViewer...)创建可直接编辑的DialogCellEditor
- 动态链接DLL与静态链接LIB
- hdu 大菲波数
- 将String转换成NSdate,并获取日期、小時、分钟(swift2.3)
- angular-ui-grid IE8版本简介
- jQuery插件之ajaxFileUpload
- jface databinding: 创建readonly(只读)可观察对象(observable)
- 12月英语总结
- 24小时天气(可滑动)
- LinearLayout布局
- Spring中ApplicationContext加载机制
- tensorflow学习笔记(二十八):collection
- jQuery Ajax 实例 全解析
- 欢迎使用CSDN-markdown编辑器
- Retrofit,Okhttp对每个Request统一动态添加header和参数