24.04.2014

equals(...) & hashCode() - Mal (fast) ohne IDE

Heute war mal wieder JUG. Uwe Sauerbrei von der JUG Ostfalen hatte Sven Ruppert als Speaker gewinnen können und dieser hat uns die volle Ladung Stream-API mit Java 8 gegeben.

Neben den vielen, vielen Informationen hat mich ein Nebensatz neugierig gemacht. Sven hat in seiner Präsentation über die in Java 7 eingebrachte java.util.Objects Klasse gesprochen und die damit vereinfachte Möglichkeit equals(...) und hashCode() Implementierungen zu erstellen.

Da ich in der letzten Woche erst Probleme mit einer fehlerhaften Implementierung hatte bin ich direkt neugierig geworden.


Ausgangsbasis ist eine einfache Entität, einfach in der Struktur und leicht zu verstehen. Gewählt habe ich in diesem Falle die Tofuwurst, da ja bald wieder die Grillsaison ansteht ;-)


Eine Tofuwurst ist fachlich eindeutig gekennzeichnet durch die Marke und das Gewicht, sowie die Kalorien. Die ID soll in diesem Fall einfach keine Rolle spielen, das wäre zu leicht. Der erste Schritt für viele Entwickler ist das Generieren der equals(...) und hashCode() Methoden durch die IDE.


Das ist vollkommen in Ordnung und führt auch zum gewünschten Ergebnis, eben einer korrekten Implementierung von equals(...) und hashCode().


Durch die Verwendung der ternären Operatoren wird die Implementierung bereits recht kompakt und einigermaßen schick. Was also spricht dagegen? Das es auch deutlich eleganter geht. Mit Einführung der java.util.Objects in Java 7 ist keine weitere Bibliothek mehr notwendig um eine kompakte Version der equals(...) und hashCode() Implementierung zu erreichen. Neben einigen anderen nützlichen Methoden sind dort auch die Methoden equals(Object a, Object b), sowie hash(Object.... values) enthalten. Und genau diese Methoden eignen sich sehr gut um eine kompakte Implementierung zu erstellen.

Im ersten Schritt wird die generierte equals(...) Methode weiter reduziert und mit Hilfe der statischen Methoden aus java.util.Objects weiter verkleinert.


Ein erkennbarer Unterschied. Die Hilfsmethode nimmt einfache Operationen, wie beispielsweise den null Check bereits ab und somit muss sich der Entwickler an dieser Stelle nicht mehr darum kümmern.

Noch deutlicher wird es bei der Berechnung des Hashcodes, dieser kann ebenfalls kompakt und mit Nutzung der Hilfsmethoden bestimmt werden.


Ein einfacher Einzeiler, kompakter geht es nicht mehr, die gesamte Klasse stellt sich nun wie folgt dar.


Aus meiner Sicht ein eleganter Weg die beiden Methoden auch mal von Hand zu implementieren, geht fast so schnell wie generieren lassen.

1 Kommentar:

  1. Guava lässt grüßen! Schön, dass diese Helferlein ihren Weg in die Java Standard Plattform gefunden haben. Danke für den Tipp! Es dauert aber bestimmt nicht lange, dann wird IDEA die generierten Methoden auch auf Basis des Project Language Levels die Objects-Helper-Methoden ausspucken. Sei noch kurz darauf hingewiesen, dass sich der EqualsVerifier in diesem Beispiel über die Abhängigkeit von hashCode auf veränderbare Exemplar-Variablen nicht freuen würde :)

    AntwortenLöschen