Vlákno názorů k článku Novinky v JDK 7 (5) – projekt Lambda a anonymní funkce v příkladech od Jan Lender - "...je žádoucí přetížit i metodu equals(), a to...

  • Článek je starý, nové názory již nelze přidávat.
  • 9. 12. 2010 13:52

    Jan Lender (neregistrovaný)

    "...je žádoucí přetížit i metodu equals(), a to takovým způsobem, aby tato metoda vracela hodnotu true v případě, že metoda compareTo() vrací nulu."
    Tohle platí, ovšem přesně obráceně: Jestliže equals vrátí true, compareTo musí vrátit nulu.
    Kdyby měla být aplikována autorova poučka na jeho příklad s rodnými čísly (compareTo vrací nulu v případě shody číslic před lomítkem), pak by equals vracela true pro lidi stejného pohlaví narozené v tentýž den (+ lidi narozené v okolních stoletích). Což je v případě použití rodného čísla například jako klíče v java.util.Map docela děsivá představa.

  • 9. 12. 2010 15:39

    Pavel Tišnovský
    Zlatý podporovatel

    Pokud se pouze pretizi equals(), tak to pracovat bude, protoze se pri pristupu k prvkum nejdrive kontroluje hashCode(), ktery musi byt shodny soucasne s equals(). I kdyz se samozrejme jedna o krehky kod, ktery zavisi na tom, ze hashCode() pro kazda dve sestimistna cisla je rozdilny - coz je, ale pro jine JDK to nemusi platit ;-)

  • 10. 12. 2010 18:29

    yanas (neregistrovaný)

    Je dobré neplést pojmy "přetížit" (overload) a "překrýt" (override). Přetížení metody equals() nevede k očekávanému výsledku (naopak může vést k velmi špatně vystopovatelné chybě), překrytí ano. Z kontextu je jasné, jak to myslíte, ale může to být dosti zavádějící.

    Dále z textu není patrné, zda by měl člověk překrýt metodu equals() na komparátoru, nebo ve třídě Employee. Metoda Comparator.equ­als(Object) já trošku jinou sémantiku než Object.equals(Ob­ject).

    A když už jsem za hnidopicha, tak ještě jedna drobnost. :-) Pojmy "třídit" a "řadit" v češtině znamenají něco jiného. Třídíme odpad, řadíme studenty podle jména.