Представьте себе следующую задачу:Java hashCode, искусственные поля?
// Class PhoneNumber implements hashCode() and equals()
PhoneNumber obj = new PhoneNumber("mgm", "089/358680");
System.out.println("Hashcode: " +
obj.hashCode()); //prints "1476725853"
// Add PhoneNumber object to HashSet
Set<PhoneNumber> set = new HashSet();
set.add(obj);
// Modify object after it has been inserted
obj.setNumber("089/358680-0");
// Modification causes a different hash value
System.out.println("New hashcode: " +
obj.hashCode()); //prints "7130851"
// ... Later or in another class, code such as the following
// is operating on the Set:
// Unexpected Result!
// Output: obj is set member: FALSE
System.out.println("obj is set member: " +
set.contains(obj));
Если у меня есть класс, и я хочу, чтобы все мои поля, чтобы быть редактируемыми и все еще быть в состоянии использовать набор/хэш-код. Было бы хорошей идеей создать искусственное неизменяемое поле в классе, установленном при создании объекта? Например, текущее время в мс. Когда у меня есть это поле, я могу создать хэш-код, и я все равно смогу редактировать все «реальные» поля. Будет ли это хорошей идеей?
Только если это имеет смысл.Как вы собираетесь посмотреть что-то в наборе на основе «искусственного» поля? –
, конечно, это называется «инкапсуляция данных»: https://en.wikipedia.org/wiki/Data_encapsulation – specializt
Время в миллисе не так много, но, возможно, GUID. –