Кроме объектов неизменяемых значений, когда мне следует переопределить `equals ()`? - PullRequest
3 голосов
/ 01 февраля 2012

Понятно, что equals() (и, конечно, hashCode()) полезны, когда вы имеете дело с неизменяемыми объектами значений - ключами карты, строго типизированными значениями полей, которые необходимо сравнить между объектами, которые их содержат, и т. Д. .

Но, кроме объектов-значений, как часто действительно бывает, что у вас есть два независимо сконструированных экземпляра, и вы хотите, чтобы они были equal?

Мне трудно представить реалистичный сценарий, в котором ссылочное равенство не будет, де-факто , получить то, что вы хотите; и в этих конкретных случаях кажется, что метод эквивалентности для конкретного сценария (isEquivalentTo(Foo) вместо equals(Object)) будет более безопасным. Особенно для изменчивых объектов?

Какой вариант использования equals() в типах без значений?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

С docs.oracle.com :

Список интерфейсов

логическое значение содержит (Объект o)

Returns true if this list contains the specified element. 

Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент е такой, что (o == null? e == null: o.equals (e) ).

Итак, переопределение equals полезно для этой (и других) языковых конструкций.

Учтите это (извините, это в C #):

class MimeType
{
    public string Name { get; set; }
    public string Extension { get; set; }    

    public override bool Equals(object obj)
    {
        var other = obj as MimeType;
        if (other == null) return false;
        return other.Name == Name;
    }
}

class Program
{
    void Main()
    {
        var jpeg1 = new MimeType();
        jpeg1.Name = "image/jpeg";
        jpeg1.Extension = ".jpg";

        var jpeg2 = new MimeType();
        jpeg2.Name = "image/jpeg";
        jpeg2.Extension = ".jpeg";    

        var list = new List<MimeType>();
        list.Add(jpeg1);

        if (!list.Contains(jpeg2))
            list.Add(jpeg2);
    }
}

В приведенном выше примере объект jpeg2 не будет добавлен в список, поскольку список уже содержит эквивалентный экземпляр.

Обновление:

Ради интереса я добавил члена Extension в класс MimeType.

0 голосов
/ 01 февраля 2012

Um. Set<E> является изменяемым и имеет (полезное) определение equals(). Это не кажется бесполезным ...

...