除了不可变的值对象,什么时候应该覆盖`equals()`?

时间:2012-02-01 01:00:31

标签: java equals

很明显,equals()(当然还有hashCode())在处理不可变值对象时很有价值 - 地图键,强类型字段值需要在对象之间进行比较包含它们等等。

但是除了价值对象之外,你有多少次经常会有两个独立构建的实例,并希望它们是equal

我很难想象一个现实的场景,即参照平等不会,事实上,得到你想要的东西;在这些特定情况下,似乎情景特定的等价方法(isEquivalentTo(Foo)而不是equals(Object))会更安全。特别是对于可变对象?

非值类型中equals()的用例是什么?

2 个答案:

答案 0 :(得分:0)

庵。 Set<E>是可变的,并且具有equals()的(有用的)定义。那似乎毫无用处......

答案 1 :(得分:0)

来自docs.oracle.com

  

接口列表&lt; E&gt;

     

boolean contains(Object o)

Returns true if this list contains the specified element. 
     

更正式地说,当且仅当此列表包含至少一个时,才返回true   元素e这样   (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类。