Posts mit dem Label Java7 werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Java7 werden angezeigt. Alle Posts anzeigen

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.

10.07.2013

Quick & Dirty - Optische Aufteilung von numerischen Werten durch Unterstriche

Der letzte Vortrag über die Neuerungen in Java 8 hat als nettes Detail auch eine einfache Möglichkeit zur optischen Aufteilung von numerischen Werten aufgedeckt.

Ich selber kannte den Trick noch nicht und nach ein wenig Recherche war mir klar, dass diese Möglichkeit auch erst mit Java 7 besteht und vorher noch nicht gegeben war.

Um was geht es also? Eine einfache Erläuterung anhand eines Beispiels zeigt, was genau gemeint ist.



Basis für das Beispiel ist ein einfaches Konto, heruntergebrochen auf ein minimales Modell. Keine Zinsen, keine Boni und auch keine sonstigen Vergünstigungen, Kosten oder was auch immer.



Und auf diesem Konto wird gearbeitet. Das Konto wurde irgendwann mal von den Eltern angelegt und wird mit einem gewissen Betrag versehen, je nachdem wie lieb einem das Kind ist.



Dann kommt Oma und füllt das Konto auf, ganz wie es aus dem realen Leben bekannt ist.
 

Bis dato war ja noch kein Problem erkennbar. Alle Zahlen sind gut erkennbar und es bereitet keine Probleme sich durch den Code zu hangeln. Jetzt kommt irgendwann aber Robert Geissen und adoptiert das liebe Kind. Schon steigt der Kontostand um ein Vielfaches:



Eine Menge Geld, allerdings total unübersichtlich. Und genau das lässt sich ändern. Seit Java 7 ist es möglich, dass Zahlen durch Unterstriche optisch getrennt werden.



Sieht doch direkt deutlich aufgeräumter und übersichtlicher aus. Unterstriche können innerhalb der Zahl beliebig häufig verwendet werden und haben keinen Einfluss auf das Ergebnis. Damit dies ersichtlicher wird, gibt es für das kleine Beispiel nach jeder Kontobewegung den neuen Kontostand.



Das funktioniert natürlich nicht nur für ganzzahlige Werte, sondern auch für Fließkommazahlen. Möchte also das Finanzamt seinen wohlverdienten Betrag von unserem kleinen Konto, so kann auch hier der Abzug übersichtlich dargestellt werden.



Bei einer Betrachtung außerhalb dieses kleinen Beispiels wird sicherlich auch der reale Einsatzzweck etwas klarer. Natürlich sollten damit nicht alle Zahlen unterteilt und nicht alle Möglichkeiten ausgeschöpft werden, aber dennoch ist der Einsatz für Konstanten oder auch größere lokale Werte eine nette Möglichkeit.

Und das sieht so doch auch gleich viel übersichtlicher aus, oder?