Jiří Hradil blog

o software


Jak má vypadat správná metoda equals()?

Nejdříve trocha matematiky.
Metoda equals() implementuje vztah ekvivalence. Je:
  • reflexivní: Pro jakoukoli odkazovou hodnotu x musí x.equals(x) vrátit true.
  • symetrická: Pro jakékoli odkazové hodnoty x a y musí x.equals(y) vrátit true jen a pouze tehdy, když y.equals(x) vrátí true.
  • tranzitivní: Pro jakékoli odkazové hodnoty x, y a z musí platit, že když x.equals(y) vrací true a y.equals(z) vrací true, pak x.equals(z) musí vrátit true.
  • konzistentní: Pro jakékoli odkazové hodnoty x a y musí platit, že více volání x.equals(y) stále vrací true nebo stále vrací false za předpokladu, že nedojde ke změně žádných informací použitých v porovnáváních equals() daného objektu.
  • nenullová“: Pro všechny odkazové hodnoty x, které nejsou null, musí x.equals(null) vrátit false.

Recept na kvalitní equals by mohl vypadat takto:

1. Pomocí operátoru == prověřte, zda je argument odkazem na tento objekt. Pokud ano, vraťte true (výkonnostní optimalizace).
2. Pomocí operátoru instanceof prověřte, zda je argument správného typu. Pokud ne, vraťte false.
3. Převeďte argument na správný typ (protože jsme už provedli instanceof, vždy to dopadne dobře).
4. U každého významného atributu dané třídy prověřte, zda daný atribut argumentu odpovídá příslušnému atributu tohoto objektu. Pokud všechny tyto testy uspějí, vraťte true; jinak false.
5. Když dokončíte zápis metody equals(), položte si 3 otázky: je symetrická, je tranzitivní a je konzistentní? (Zbývající 2 vlastnosti se obvykle naplní samy.) Pokud ne, je třeba metodu upravit. :)

ZDROJ: Joshua Bloch: Java efektivně-57 zásad softwarového experta, Grada Publishing, 1. vydání, Praha 2002, ISBN: 80-247-0416-1

Publikoval Jiří Hradil • 15.01.2004 v 01:01 • pod kategorií Nezařazené

No comments yet.

Komentovat

Security Code: