| Implementations of `Object#hashCode` should not incorporate fields which the |
| implementation of `Object#equals` does not. This violates the contract of |
| `hashCode`: specifically, equal objects must have equal hashCodes. |
| |
| ```java |
| class Foo { |
| private final int a; |
| private final int b; |
| |
| Foo(int a, int b) { |
| this.a = a; |
| this.b = b; |
| } |
| |
| @Override |
| public boolean equals(@Nullable Object o) { |
| return o instanceof Foo && ((Foo) o).a == a; |
| } |
| |
| @Override |
| public int hashCode() { |
| return a + 31 * b; |
| } |
| } |
| |
| Foo first = new Foo(10, 20); |
| Foo second = new Foo(10, 40); |
| |
| first.equals(second) // true |
| first.hashCode() == second.hashCode() // false |
| ``` |
| |
| The fix for this class is either to include a comparison of `b` in the `#equals` |
| method, or remove `b` from `#hashCode`. The former is more likely to be correct. |