Предположим, мы имеем следующий класс:Java: Можно ли реализовать hashCode и равно для стороннего класса?
public class SingleElementRefType
{
protected JAXBElement<SequenceType> sequence;
// ...
}
Он содержит sequence
поле типа JAXBElement
.
JAXBElement
класс третьей стороной (стандарт API, на самом деле), что, в сущности, чистый класс значение, но по какой-то причине не реализует hashCode
и equals
методы.
С моей точки зрения, эти методы здесь абсолютно разумны.
Я хотел бы реализовать equals
и hashCode
методы SingleElementRefType
, а также SequenceType
так, что я мог бы сделать глубокое сравнение этих значений. Но JAXBElement
стоит на пути.
Поскольку я не могу продлить JAXBElement
, моя идея состояла в том, чтобы интегрировать hashCode
и equals
в класс агрегирующего (SingleElementRefType
здесь):
JAXBElement<SequenceType> theSequence;
theSequence = this.getSequence();
final QName theSequenceName = theSequence.getName();
currentHashCode = ((currentHashCode* 37) +
((theSequenceName!= null)?theSequenceName.hashCode(): 0));
final Object theSequenceValue = theSequence.getValue();
currentHashCode = ((currentHashCode* 37) +
((theSequenceValue!= null)?theSequenceValue.hashCode(): 0));
Но тогда у меня был второй мысли, если я не нарушает какое-либо соглашение или правила здесь.
Существуют ли какие-либо опасности для реализации hashCode
и equals
для сторонних классов в моих агрегирующих классах?
Обновление: по каким-либо причинам у моего кода могут отсутствовать дополнительные зависимости от времени выполнения. Поэтому я не могу использовать Guava или commons-lang
здесь.
Это вполне разумная вещь, если вам это нужно; если вы используете Guava, вы можете использовать «Эквивалентность», см. [здесь] (http://javachannel.org/posts/guavas-equivalence-strategy-for-equalshashcode/). – fge
@fge Невозможно использовать Guava здесь - мой код не должен иметь дополнительных зависимостей времени выполнения. Но хороший совет, я проверю концепцию. – lexicore
Не мог ли содержащийся класс (я предполагаю, что это будет тот, который представляет другой элемент XML), позаботится о равных и хэш-кодах, просто обойдя JAXBElement? Я знаю, что xjc не включает эти методы, но плагин мог бы, и поэтому мог бы быть написанный вручную класс, когда элементу нужна оболочка JAXBElement. – laune