Иногда у нас возникает достаточно большая иерархия объектов. Часто в этой иерархии нам приходится переопределять стандартную реализацию hashCode() от класса Object на свою. Для чего нужен hashCode() и его связь с equals(Object other) можно прочесть в моей прошлой статье, посвящённой этим методам. Но что делать, если в последующем нам нужно в одном из дочерних классов вызвать первоначальную реализацию hashCode()?
Если мы вызовем super.hashCode(), то мы получим вызов родительского метода hashCode(). А если мы наследовались не от Object, а от другого класса, где уже написали свою реализацию hashCode()? Как пробраться через всё дерево наследования к корневому предку Object и вызвать его метод?
В Java это уже невозможно, но, к счастью, существует метод, который позволяет выполнить метод hashCode() от Object для любого объекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public final class System { ... /** * Returns the same hash code for the given object as * would be returned by the default method hashCode(), * whether or not the given object's class overrides * hashCode(). * The hash code for the null reference is zero. * * @param x object for which the hashCode is to be calculated * @return the hashCode * @since JDK1.1 */ public static native int identityHashCode(Object x); … } |
В метод System.identityHashCode(Object x) можно передать экземпляр любого объекта, и он вернёт то же самое значение, которое бы вернул метод hashCode() от класса Object.
Рекомендую ознакомиться с моим учебником Java, думаю, он вам понравится.