gpt4 book ai didi

java - 限制哪些值可以在 javafx 属性中结算?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:57 25 4
gpt4 key购买 nike

将 javafx 属性的值保持在特定范围内的最佳方法是什么?

(或者 - 这种不好的做法是否存在任何理由从不过滤由 javafx 属性包装的值?)

示例 1:避免在 IntegerProperty 中使用负值
示例 2:将 IntegerProperty 的值保持在列表的范围内

第一个想法:- 覆盖 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 属性中的任何内容?

(如有必要,请帮助我改进本文可能不好的英文...)

最佳答案

在您的两个示例中,似乎都有一个合乎逻辑的默认值(例如,如果需要为正数,则负数变为 0)。假设您记录得很好(如果值无效,默认值是什么),我认为您的第一种方法似乎是在正确的道路上。

我建议从像 SimpleIntegerProperty 这样的具体类开始作为您要扩展的类(除非出于某种原因您选择了 IntegerPropertyBase

然后我将覆盖 set(int) 方法和 setValue(Number) 方法,将父级包装在您的逻辑中:

    /**
* Explanation that values under 0 are set to 0
*/
@Override
public void set(int value){
super.set(value > 0 ? value : 0);
}

/**
* Explanation that values under 0 are set to 0
*/
@Override
public void setValue(Number value){
super.setValue(value.intValue() > 0 ? value : 0);
}

可能存在不存在逻辑默认值的情况(或者您只想拒绝无效值)。这种情况让它变得有点困难——你实际上想要使用这样的方法签名,这样调用者就知道值是否改变了:

public boolean set(int value)

为此,您必须返回相当多的类 - 一直返回到 ReadOnlyIntegerProperty 并自己实现设置/失效结构。

我会犹豫是否使用异常来处理无效输入。这是异常的合法使用,但我担心异常会被依赖于验证。异常是非常耗费资源的,只有在需要修复的情况下才应该触发。因此,这实际上取决于您的意图以及您对使用您的类(class)的人做正确事情的信任程度(并在发送给您之前进行验证)。

关于java - 限制哪些值可以在 javafx 属性中结算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17590846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com