Метод hashCode в случае, если метод equals поддерживает wildchar - PullRequest
0 голосов
/ 01 октября 2018

У меня есть класс, чьи объекты будут храниться в hashmap, hashset.

Мне нужно поддерживать равенство подстановочных символов для полей, поэтому я добавил эту проверку в методе equals.Теперь, как я могу построить свой метод хэш-кода на основе этого параметра?то есть, если я вычисляю, как показано в коде ниже, я получу другой хеш-код для 2 объектов, которые проходят проверку на равенство моего метода equals.

Например, рассмотрим следующий класс:

public class Person {   

    private String fname = "";
    private String lname = "";
    private String profession = "";

    // getters & setters



    @Override
    public boolean equals(Object obj) {
        if (fname == null) {
            if (other.fname != null)
                return false;
        } else if (!fname.equals(other.fname) && !other.fname.equals("*") && !fname.equals("*"))
            return false;
        return true;

        // similar for other fields
    }


    @Override
    public int hashCode() {     
        return Objects.hashCode(this.fname, this.lname , this.profession);
    }
}

РЕДАКТИРОВАТЬ:

Как указано в некоторых комментариях, должен быть отдельный методпроверить равенство wildchar.Ограничением этого подхода является то, что я не смогу получить правильные результаты для таких методов, как set.contains, поскольку они проверяют наличие object.equals внутри.Так что мой set.contains вернет false, даже если мои объекты пройдут проверку на равенство моего отдельного метода равенства с подстановочными символами.

1 Ответ

0 голосов
/ 01 октября 2018

Использование той же логики в hashCode() невозможно, так как мы не вычисляем хеш-код в соответствии с сравниваемым объектом, но мы вычисляем его в соответствии с текущим состоянием объекта .
Вы можетеверните постоянное значение в методе hashCode(), но это будет неэффективно, и поэтому это не будет хорошей идеей.
Ваша первоначальная проблема связана с тем, что вы хотите взять на себя ответственность, не предназначенную дляequals() метод: определение равенства за фактическим состоянием объектов (то есть фактическими значениями полей).
Таким образом, вы не должны использовать метод equals() для сравнения с подстановочными знаками, а вместо того, чтобы написать специальный метод для.

...