只是想知道Change
中的每个ListChangeListener
对象是否只包含一种类型的更改。
while (c.next() {
if (c.wasAdded()) {
}
if (c.wasRemoved()) {
}
if (c.wasUpdated()) {
}
if (c.wasPermutated()) {
}
if (c.wasReplaced()) {
}
}
while (c.next() {
if (c.wasAdded()) {
}
else if (c.wasRemoved()) {
}
else if (c.wasUpdated()) {
}
else if (c.wasPermutated()) {
}
else if (c.wasReplaced()) {
}
}
这两者之间是否存在差异,哪种方式更受欢迎?
答案 0 :(得分:1)
在kleopatra的帮助下,我找到了答案。它实际上位于ListChangeListener.Change
的{{3}},但解释隐藏在底部。
注意:如果更改包含多个不同类型的更改, 这些更改必须按以下顺序排列:排列更改, 添加或删除更改,更新更改这是因为排列 添加/删除更改后,更改无法进行,因为它们会更改 添加元素的位置。另一方面,必须更新更新 继续添加/删除更改,因为它们引用了索引 列表的当前状态,表示所有添加/删除更改 应用
实际上有一件令人困惑的事情。这个说明告诉我们做排列 - >添加/删除 - >更新,但给出的例子是置换 - >更新 - >添加/删除。我已经确定解释所给出的顺序肯定更有意义。此外,该示例显示这3种主要类型的更改永远不会发生在单个Change
对象中,这与解释所说的相矛盾。
所以我的结论是:
Change
对象视为可以在单个对象中具有所有类型的更改。这意味着应该避免使用else if
。答案 1 :(得分:1)
ListChangeListener.Change
可以包含任意组合的更改类型。共有3组状态互斥:
使用ListChangeListener.Change.next()
迭代这些状态。发生这些更改的顺序与上面的列表中的顺序相同:首先遍历所有排列更改,然后通过添加/删除/替换更改以及最后更新更改。
这意味着您可以使用以下代码:
while (c.next()) {
if (c.wasReplaced()) {
// ...
} else if (c.wasAdded()) {
// ...
} else if (c.wasRemoved()) {
// ...
} else if (c.wasPermutated()) {
// ...
} else if (c.wasUpdated()) {
// ...
}
}
只要在检查添加和删除之前检查替换更改,就可以对if/else if
中的检查重新排序,因为替换更改意味着wasRemoved
和wasAdded
都会产生true
。 (在您的第二个代码段中不是这种情况。)
或者,如果您不需要区分添加,删除和替换:
while (c.next()) {
if (c.wasPermutated()) {
// ...
} else if (c.wasUpdated()) {
// ...
} else {
// Handle add/remove/replace change
}
}