我在一个鲜为人知的专有框架管理的类中有一个 List
字段。
注释 @BindMagic
由框架管理,因此底层列表有时会发生变化:它可能会被重新创建,或者它的元素可能会发生变化。
class SharedEntity{
@BindMagic // this annotation does a magic that we cannot control
private List<Map<String,Object>> values;
public boolean isChangedSincePreviousCall(){
// check if "values" have changed since the previous call of this method
}
}
我同意这是一个糟糕的设计,但让我们假设没有可能影响它。
不时(不是每次突变)需要检查列表是否已更改。例如,我想用 isChangedSincePreviousCall
方法来完成。
也许,像哈希和这样的东西会很好。但我很好奇是否有更好的方法。
检测列表是否更改的最佳做法是什么?
最佳答案
使用散列不是确定的,因为可以从不同的输入生成相同的散列,尽管这种可能性很小。
“被改变”和“与众不同”意味着不同的事情。考虑其中一个映射中的条目,该条目从 "A"-> 1
更改为 "A"-> 2
然后返回到 "A"-> 1
在对您的方法的调用之间再次调用 - 它已更改但没有不同。我假设你的意思是“不同”。
检查时复制一份,并与当前状态进行比较。假设 map 值为 immutable :
class SharedEntity {
@BindMagic
private List<Map<String, Object>> values;
private List<Map<String, Object>> valuesCopy;
public boolean isChangedSincePreviousCall() {
newCopy = new ArrayList<>(values);
boolean result = !Objects.equals(valuesCopy, newCopy);
valuesCopy = newCopy;
return result;
}
}
如果 Map 值是(或包含)可变对象,则您必须在创建副本时对它们进行深度复制。
仅供引用 Objects#equals()
如果两个参数都为空,则返回 true
。
关于java - 如何检测列表是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56661418/