Метод equals() класса Object проверяет, эквивалентны ли два объекта. Поскольку метод equals() реализован в классе Object, он определяет лишь, ссылаются ли переменные на один и тот же объект. В качестве проверки по умолчанию эти действия вполне оправданы: всякий объект эквивалентен самому себе.
Для некоторых классов большего и не требуется. Например, вряд ли кому-то потребуется анализировать два объекта PrintStream и выяснить, отличаются ли они друг от друга. Однако в ряде случаев эквивалентными должны считаться объекты одного типа, имеющие одинаковые состояния.Рассмотрим в качестве примера обьекты, описывающие сотрудников. Очевидно, что они одинаковы, если совпадают имена, размеры заработной платы и даты приема на работу. Строго говоря, в реальных системах учета информации о сотрудниках более оправдано сравнение идентификационных номеров. Здесь же мы лишь демонстрируем принципы реализации метода equals().
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Employee { public boolean equals(Obecjt otherObject) { if(this == otherObject) return true; if(otherObject == null) return false; if(getClass() != otherObject.getClass()) return false; Employee other = (Employee) otherObject; return name.equals(other.name) && salary = other.salary; && hireDay.equals(other.hireDay); } } |
Метод getClass() возвращает класс объекта. Чтобы обьекты были эквивалентны, они как минимум должны быть обьектами одного и того же класса. Определяя метод equals() для подкласса, надо сначала вызывать тот же метод суперкласса. Если проверка даст отрицательный результат, обьекты не могут быть идентичными. Если же поля суперкласса совпадают, можно приступать к сравнению полей подкласса.
1 2 3 4 5 6 7 8 9 |
class Manager extends Employee { { public boolean equals(Object otherObject) { if(!super.equals(otherObject)) return false; Manager other = (Manager) otherObject; return bonus == other.bonus; } } |