私が持っている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
、あなたのメソッドの呼び出しの間で再びを-それはして変化していないが、違います。私は、あなたが「異なる」を意味するものとします。
チェックする際にコピーを作成し、現在の状態でそれを比較します。マップ値であると仮定すると不変:
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;
}
}
地図値は、(または含まれている)場合は変更可能なオブジェクトには、コピーを作成するときにそれらの深いコピーを作成する必要があります。
FYI Objects#equals()
返しtrue
、両方のパラメータがnullの場合。