繁体   English   中英

扩展类的正确方法,以便我可以覆盖equals()

[英]Correct way to extend a class so I can override equals()

我在一个不能更改的程序包中有一个类。 此类不会覆盖Object.equals(),并且具有不同的equals实现会真正使我的代码更干净。

我知道我做不到:

MyClass extends OtherClass{
@Override
public boolean equals(MyClass that)
{
//compare members and other stuff here
}
}

OtherClass oc1 = new OtherClass();
OtherClass oc2 = new OtherClass();
oc1.equals(oc2); //false because of Object.equals
//I want to do something like the following
MyClass mc1 = (MyClass) oc1; //throws class cast exception
MyClass mc2 = (MyClass) oc2; //throws class cast exception
mc1.equals(mc2); //true

什么是完成此任务的正确方法?

我可以编写类似equals(OtherClass oc1,OtherClass oc2)的方法,但这用处不大。 如果可以实现等于,则可以使用List.contains或Sets之类的东西来管理数据并简化生活。

如何创建包装器类?

MyWrapper {
    private OtherClass data;

    MyWrapper(OtherClass data) {
        this.data = data;
    }

    public boolean equals(Object that) {
        ...
    }
}

如有必要,为存储的对象添加吸气剂。

不要覆盖equals ,也不要覆盖hashCode 另外,拥抱Apache Commons lang,它提供了许多有用的类。 使用Apache Commons EqualsBuilder和Apache Commons HashCodeBuilder类提供缺少等号操作的类如下所示:

public class NiceBerry extends NaughtyBerry
{
    public boolean equals(Object rhsObject)
    {
        if (rhsObject == null)
        {
            return false;
        }

        if (rhsObject == this)
        {
            return true;
        }

        if (rhsObject instanceof NiceBerry)
        {
            EqualsBuilder equalsBuilder = new EqualsBuilder();
            NiceBerry rhs = (NiceBerry)rhsObject;

            equalsBuilder.append(getField1(), rhs.getField1());
            equalsBuilder.append(getField2(), rhs.getField2());
            ... append all the naughty berry fields

            return equalsBuilder.isEquals();
        }
        else
        {
            return false;
        }
    }

    public int hashCode()
    {
        // you pick a hard-coded, randomly chosen, non-zero, odd number
        // ideally different for each class
        HashCodeBuilder hashBuilder = new HashCodeBuilder(17, 37);

        hashBuilder.append(getField1());
        hashBuilder.append(getField2());
        ... append all the naughty berry fields

        return hashBuilder.toHashCode();
    }
}

我在Google上搜索后发现: 示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM