Използване на equals() в compareTo()?

Тестови код (само за да се съобразите с SSCCE, очевидно има много по-добри начини да разклатите собствените си модели на данни, които не са чувствителни към главни и малки букви)

public class TestClass implements java.lang.Comparable<TestClass> {

    public String test;

    @Override
    public int compareTo(TestClass o) {
        if (o == null) {
            throw new NullPointerException();
        }
        return equals(o) ? 0 : test.toLowerCase().compareTo(o.test.toLowerCase());
    }

    @Override
    public boolean equals(Object o) {
        return (o == this) ? true : o instanceof TestClass ? test.equalsIgnoreCase(((TestClass) o).test) : false;
    }

    @Override
    public int hashCode() {
        return test.toLowerCase().hashCode();
    }
}

Кажете, искам моят клас, прилагащ Comparable, да следва „силната препоръка“ предложен в API:

Силно се препоръчва, но не е строго задължително (x.compareTo(y)==0) == (x.equals(y)).

Ще бъде ли добре тогава да използвате equals() вътре в compareTo()? Разбира се, гарантираме, че equals() няма да се обади на compareTo() в отговор.

Подобно: Кога да включите какво?


person h.j.k.    schedule 06.09.2013    source източник
comment
Питам за използването на equals() в compareTo(), а не за да обсъждам кога да използвам equals() или compareTo(). ;) Също така не се задълбочавам в имплементацията на equals() и compareTo() в класа String, това е извън обхвата тук. Тестовият код всъщност е само за визуализиране на това как equals() може да се използва в compareTo().   -  person h.j.k.    schedule 06.09.2013
comment
Добре е, но между другото: не пишете неща като a? true: b? c: false. Това е объркан израз за a || b && c. Т.е. return o==this || o instanceof TestClass && test.equalsIgnoreCase(((TestClass) o).test) ще направи същото.   -  person Holger    schedule 06.09.2013
comment
Благодаря, че забеляза това! :) Разбрах, че има нещо подозрително, когато пишех вярно/невярно... Страхотен улов тук.   -  person h.j.k.    schedule 06.09.2013


Отговори (1)


Трябва да е добре, стига да правите NPE проверка, преди да извикате equals() вътре в compareTo().

Още една точка ще бъде преди да направите

test.toLowerCase().compareTo(o.test.toLowerCase());

трябва също така да проверите дали test е NULL, защото "someString".compareTo((String)null) ще хвърли NullPointerException.

person Aniket Thakur    schedule 06.09.2013
comment
Благодаря, че забеляза това! :) - person h.j.k.; 06.09.2013