adjust hashCode() to match equals()