java – ObservableList:如何可靠地检测setAll?

在某些上下文中,有必要在ListChangeListener中检测,而不用对列表本身进行控制 – “所有数据被换出”,f.i.当我们需要清除一些状态像选择 – 在全新的数据,旧的状态是没有意义的。

完全新的数据可以达到

> list.setAll(…)
> list.set(otherObservableList)如果list是ListProperty

考虑在setAll上可以触发哪些类型的更改(c是更改,项目是观察列表,用于计运算符变换的“subChangeCount”伪代码):

// initially empty
assertEquals(0, items.size());
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasAdded() && !c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize()); 

// initially not empty
assertTrue(items.size() > 0);
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize()); 

这似乎允许一个实用程序检查,如:

boolean wasSetOrClearedAll(Change c) {
   if (c.getList().isEmpty()) return true;
   c.next();
   if (c.getAddedSize() == c.getList().size()) return true; 
   return false; 
}  

相比之下,内部的fx代码,f.i.在听ComboBox的项目:

while (c.next()) {
   comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
   ... 
}
comboBox.previousItemCount = getItemCount();

存储旧的itemCount并将其与当前的removeSize进行比较(我感到不舒服,旧状态对于我的口味来说太过分了),但是我很有可能通过我的方法丢失了一些东西。

问题是:

在这种情况下,我的实用程序方法失败(核心方法会正确检测setAll)?

不幸的是,没有可靠的方式在侦听器端检测到这一点。

这个斗争从默认实现开始,大部分看起来像这样:

@Override
public boolean setAll(Collection<? extends E> col) {
    beginChange();
    try {
        clear();
        addAll(col);
    } finally {
        endChange();
    }
    return true;
}

如果你传递一个空的集合来设置所有的结果和被触发的事件都是完全一样的,当你调用clear。

所以你的方法isSetOrClearedA也返回true,当清除被调用也(核心实现)。

所以到底是没有通用的setAll检测,这一切都取决于你的用例。如果您可以缩小搜索范围,您可以为此编写一个过滤器。

翻译自:https://stackoverflow.com/questions/26994886/observablelist-how-to-reliably-detect-a-setall

转载注明原文:java – ObservableList:如何可靠地检测setAll?