【发布时间】:2013-07-09 13:48:42
【问题描述】:
将 javafx 属性的值保持在特定范围内的最佳方法是什么?
(或者 - 这是不好的做法,是否存在从不过滤由 javafx 属性包装的值的任何理由?)
示例 1:避免 IntegerProperty 中的负值
示例 2:将 IntegerProperty 的值保持在 List 的范围内
第一个想法:-覆盖IntegerPropertyBase.set(int)。它是安全的?实际上setValue(int) 只调用set(int),但是 - 如果有一天这个实现发生变化 - 对值集的控制就会丢失。
第二个想法:-覆盖IntegerPropertyBase.invalidate()。但此时值已经设置好了。
它是否更适合 javafx 属性抛出 IllegalArgumentException(或 ArrayIndexOutOfBoundsException,如果包装的值是数组的索引),或者更好地拒绝值越界,设置回边界中的最后一个值?
可能是这样的:
class BoundedIntegerProperty extends IntegerPropertyBase {
(...)
int oldValue = defaultValueInBounds;
boolean settingOldValue = false;
public void invalidated() {
if(!settingOldValue){
if(outOfBounds(get())){
settingOldValue = true;
set(oldValue);
} else {
oldValue = get();
}
} else
settingOldValue = false;
}
}
只有在 invalidated() 中为越界的值抛出异常可能会使属性的值越界。
我是否忽略了用于过滤值的 javafx 属性中的任何内容?
(如有必要,请帮我改善这篇文章可能不好的英文...)
【问题讨论】:
-
在设置属性之前验证输入可能更简单,例如验证文本字段、数据库结果或文件中的数据。我看不出有什么好的方法来处理这个问题,你真的想要任何 #set() 调用来引发异常吗?
-
您说得对:例如,为无法访问该列表的列表设置索引是没有意义的。但是,如果我可以访问列表,则 index 属性的设置器可能在列表本身中,并且该属性可能是只读的。在 List 中,如果索引超出范围,索引的设置器可能会抛出异常。
标签: java properties javafx javafx-2