@Override public boolean equals(Object other) { return StateHelper.equalsStrict(this, other); }
/** * Compares two values. */ public static boolean equalsStrict(Object a, Object b) { if (a == b) { return true; } else if (a == null || b == null) { return false; } else if (a instanceof State && b instanceof State) { return equalsStrict((State) a, (State) b); } else if (a instanceof List && b instanceof List) { @SuppressWarnings("unchecked") List<Serializable> la = (List<Serializable>) a; @SuppressWarnings("unchecked") List<Serializable> lb = (List<Serializable>) b; return equalsStrict(la, lb); } else if (a instanceof Object[] && b instanceof Object[]) { return equalsStrict((Object[]) a, (Object[]) b); } else if (a instanceof ListDiff && b instanceof ListDiff) { ListDiff lda = (ListDiff) a; ListDiff ldb = (ListDiff) b; return lda.isArray == ldb.isArray && equalsStrict(lda.diff, ldb.diff) && equalsStrict(lda.rpush, ldb.rpush); } else if (isScalar(a) && isScalar(b)) { return a.equals(b); } else { return false; } }
/** * Compares two {@link List}s. */ public static boolean equalsStrict(List<Serializable> a, List<Serializable> b) { if (a == b) { return true; } if (a == null || b == null) { return false; } if (a.size() != b.size()) { return false; } for (Iterator<Serializable> ita = a.iterator(), itb = b.iterator(); ita.hasNext();) { if (!equalsStrict(ita.next(), itb.next())) { return false; } } return true; }
/** * Compares two {@link State}s. */ public static boolean equalsStrict(State a, State b) { if (a == b) { return true; } if (a == null || b == null) { return false; } if (a.size() != b.size()) { return false; } if (!a.keySet().equals(b.keySet())) { return false; } for (Entry<String, Serializable> en : a.entrySet()) { String key = en.getKey(); Serializable va = en.getValue(); Serializable vb = b.get(key); if (!equalsStrict(va, vb)) { return false; } } return true; }