В некоторых контекстах необходимо обнаружить - в ListChangeListener, без контроля над самим списком - "все данные выгружены", т.е. когда нам нужно очистить какое-то состояние, например выборку — на совершенно новых данных старое состояние не имеет смысла.
Совершенно новые данные можно получить,
- список.setAll(...)
- list.set(otherObservableList), если список является ListProperty
Размышляя о том, какой тип изменений можно запустить в setAll (c — это изменение, items — наблюдаемый список, псевдокод «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, т.е. при прослушивании элементов ComboBox:
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
хранит старый itemCount и сравнивает его с текущим removeSize (что мне неудобно, старое состояние слишком часто устаревает, на мой вкус), тем не менее, есть большая вероятность, что я что-то упускаю с моим подходом.
Вопрос:
в каком контексте мой служебный метод потерпит неудачу (и основной подход правильно обнаружит setAll)?