Правильный способ расширить класс, чтобы я мог переопределить equals () - PullRequest
0 голосов
/ 17 декабря 2010

У меня есть класс в пакете, который я не могу изменить.Этот класс не переопределяет 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 для управления моими данными и облегчения жизни.

Ответы [ 3 ]

4 голосов
/ 17 декабря 2010

Как насчет создания класса-оболочки?

MyWrapper {
    private OtherClass data;

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

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

При необходимости добавьте получатель для сохраненного объекта.

1 голос
/ 18 декабря 2010

Не отменять 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();
    }
}
0 голосов
/ 17 декабря 2010

Я гуглил и нашел это: пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...