1. Kontrakt dla metody hashCode().
Metoda musi spełniać następujące warunki:
- W czasie działania aplikacji metoda zawsze zwraca tą samą wartość int, dla tego samego obiektu.
- Jeśli dwa obiekty są równe wg. metody equals() to wartości zwracane przez hashCode() dla tych obiektów muszą być takie same.
- Jeśli dwa obiekty nie są równe wg. metody equals() to wartości zwracane przez hashCode() dla tych obiektów nie muszą być takie same. Aczkolwiek zaleca się taką implementację hashCode(), żeby dla różnych obiektów zwracała różne wartości hash, co wpływa pozytywnie na szybkość operacji na hashowalnych kolekcjach.
@Override public int hashCode() { return new HashCodeBuilder().append(someField) .append(someField2) .toHashCode(); }
Caveat: jak wrzucisz obiekt po hashu a potem przestawisz pole wchodzące w skład, to robi się źle.
OdpowiedzUsuń@ags No tak, właśnie dlatego ta wartość musi być stała. Całkiem niedawno zresztą zastanawiałem się nad tym w kontekście Hibernate, gdzie naturalnym (i ryzykownym) podejściem wydaje się być użycie ID: http://stackoverflow.com/q/5174233/277683
OdpowiedzUsuńags: a propos czego jest Twój komentarz? Mam wrażenie, że jakiś inny (wcześniejszy) komentarz gdzieś się zapodział?
OdpowiedzUsuń