У меня есть класс, который, по конкретизации, создает уникальный идентификатор для своих объектов, как так:Является ли это плохой практикой равными() экземплярами класса только их уникальным идентификатором экземпляра?
public class Foo {
private final static AtomicInteger UNIQUE_ID = new AtomicInteger(0);
private final int id;
private final String name;
private final int hashcode;
public Foo(String name) {
id = UNIQUE_ID.GetAndIncrement();
this.name = name;
int result = 17;
int result = 31 * result + id;
int result = 31 * result + name.hashCode();
hashcode = result;
}
public int getInstanceID() { return id; }
Теперь я хочу, чтобы реализовать хэш-код и приравнивает этот путь:
public boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof Foo))
return false;
Foo other = (Foo) obj;
return other.getInstanceID == getInstanceID();
}
public int hashCode() { return hashcode; }
}
она считается плохой если я просто сравню идентификатор объектов, относящихся к любому другому полю, который может отличаться от одного Foo istance другому? Кроме того, следует ли все-таки рассматривать каждое поле в функции hashcode или просто использовать идентификатор?
Да, я знаю о контракте hashCode(), и я, конечно, внедрил его. Итак, моя функция hashcode должна использовать все поля, если я их реализую? int result = 17; result = 31 * result + id; result = 31 * result + name.hashCode(); – Jan
@Jan - Это улов. Ваш 'hashCode()' должен следовать 'equals()' i.e, * контракт не указывает, какие все поля должны быть включены *. 'return 5' - это допустимая реализация' hashCode() '. Единственное, что имеет значение, - это * для любых двух экземпляров 'x' и' y', если 'x.equals (y)' истинно, тогда 'x' и' y' должны иметь один и тот же 'hashCode' * – TheLostMind
Итак, я может легко просто вернуть instanceID с помощью функции hashCode, и было бы прекрасно, потому что я знаю, что каждый идентификатор класса будет уникальным? Или должны ли хэш-коды быть глобально уникальными, если это возможно? – Jan