限制哪些值可以在javafx属性中解决?

Nic*_*ray 6 java javafx properties javafx-2

将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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

只有在invalidated()中抛出一个Exception,才能使超出范围的值保持属性的值超出范围.

我是否忽略了为过滤值提供的javafx属性中的任何内容?

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

Nic*_*ppe 2

在您的两个示例中,似乎都有一个逻辑默认值(例如,如果要求为正数,则负数将变为 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

public boolean set(int value)
Run Code Online (Sandbox Code Playgroud)

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

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