Я использую построитель хеш-кода как переменную экземпляра pojo.Apache Commons hashCode builder несогласованные хэши
public class Pojo {
private HashCodeBuilder hashBuilder = new HashCodeBuilder();
private int i;
public setI(int i) {this.i = i}
@Override
public int hashCode() {
hashBuilder.append(id);
return hashBuilder.toHashCode();
}
}
Теперь, если я установить значение i
на ту же величину в два раза, то мой результат хэш-код будет отличаться. Это ошибка в реализации?
Я понимаю, что это происходит из-за того, что построитель хеш-кода сохраняет текущую сумму. Но должен ли он не давать один и тот же хэш для одного и того же набора значений?
Кроме того, если я не следовать выше подходу, то я буду в конечном итоге инициализацией же хэш-код строителя в hashcode
методы моих Pojo тысячи раз следующим образом:
...
@Override
public int hashCode() {
hashBuilder = new HashBuilder();
hashBuilder.append(id);
return hashBuilder.toHashCode();
}
...
Есть ли способ чтобы сбросить эту текущую итоговую так, чтобы каждый раз, когда я вызываю hashcode
с тем же набором значений, я получаю согласованный ответ?
И почему сброс будет более эффективным, чем создание нового экземпляра? Вы не должны повторно использовать его, в первую очередь, imho. Он даже сбой с одним и тем же идентификатором и вызовом 'hashCode' дважды подряд. –
ну, вы создаете одно pojo, а затем в конечном итоге вызываете hashcode 'X' количество раз. В итоге вы создадите объекты построения хеш-кода 'X', которые потенциально собираются собирать мусор, но вы никогда не знаете, когда это произойдет. Таким образом, до этого времени ваше использование памяти увеличивается. Поэтому я думаю, что лучше иметь только одно pojo? – sttaq
НЕТ это не так. Особенно не с короткоживущими объектами, они приходят более или менее бесплатно. Они довольно быстро. Похоже на преждевременную оптимизацию, а не на реальную меру. –