Neue nummer gleicher Vertrag

Die Standardimplementierung von equals() in der Klasse Object besagt, dass Gleichheit mit der Objektidentität identisch ist. Und Einnahmen und Ausgaben sind zwei verschiedene Instanzen. Diese kompatible Lösung verwendet die equals()-Methode als ersten Test und vergleicht dann die codierte Version der Schlüssel, um das anbieterunabhängige Verhalten zu erleichtern. Dieser Code kann z. B. bestimmen, ob RSAPrivateKey und RSAPrivateCrtKey äquivalente private Schlüssel darstellen [Sun 2006]. Für eine Klassenperson mit Zeichenfolgenfeldern firstName und lastName wäre dies eine übliche Variante zum Implementieren von Gleichen: Durch die Bedienung von String-Objekten verstößt die CaseInsensitiveString.equals()-Methode gegen die zweite Vertragsanforderung (Symmetrie). Aufgrund der Asymmetrie, gegeben ein String-Objekt s und ein CaseInsensitiveString-Objekt cis, die sich nur in dem Fall unterscheiden, gibt cis.equals(s)) true zurück, während s.equals(cis) false zurückgibt. Ein Objekt zeichnet sich sowohl durch seine Identität (Standort im Speicher) als auch durch seinen Zustand (tatsächliche Daten) aus. Der Operator == vergleicht nur die Identitäten zweier Objekte (um zu überprüfen, ob sich die Verweise auf dasselbe Objekt beziehen); Die in java.lang.Object definierte equals()-Methode kann überschrieben werden, um den Zustand ebenfalls zu vergleichen. Wenn eine Klasse eine equals()-Methode definiert, bedeutet dies, dass die Methode den Zustand vergleicht. Wenn der Klasse eine benutzerdefinierte equals()-Methode fehlt (entweder lokal deklariert oder von einer übergeordneten Klasse geerbt), verwendet sie die standardmäßige Object.equals()-Implementierung, die von Object geerbt wurde. Die standardmäßige Object.equals()-Implementierung vergleicht nur die Verweise und kann zu unerwarteten Ergebnissen führen.

MET08-J-EX0: Die Anforderungen dieser Regel können verletzt werden, sofern die inkompatiblen Typen nie verglichen werden. Es gibt Klassen in den Java-Plattformbibliotheken (und anderswo), die eine instanziierbare Klasse erweitern, indem eine Wertkomponente hinzugefügt wird. Beispielsweise erweitert java.sql.Timestamp java.util.Date und fügt ein Nanosekundenfeld hinzu. Die equals()-Implementierung für Timestamp verstößt gegen die Symmetrie und kann zu unregelmäßigem Verhalten führen, wenn Timestamp- und Date-Objekte in derselben Auflistung verwendet werden oder anderweitig vermischt werden [Bloch 2008]. Das definierte Verhalten für die equals()-Methode ist bekanntlich inkonsistent mit dem virtuellen Hosting in HTTP. Betrachten Sie beispielsweise die folgende vereinfachte PhoneNumber-Klasse, deren Equals-Methode gemäß dem Rezept in Punkt 7 erstellt wird: Das war mein Punkt. Wenn Sie Liskov einhalten möchten, muss jede Unterklasse von Card Card.equals() respektieren. Wenn Card.equals() nur Zahlen vergleicht, können Sie keine ColoredCard.equals() haben, die auch vorschreibt, dass Karten nur dann gleich sind, wenn ihre Farben übereinstimmen. Sie können eine ColoredCard haben, die lediglich auf Card.equals() basiert. Dies ist eine vernünftige Entwurfsentscheidung. Der gleichberechtigte Vertrag ist kaum mehr als eine Formalisierung dessen, was wir oben gesehen haben.

Um die Quelle zu zitieren: Keine Instanz sollte gleich null sein, also gehen wir hier sicher, dass. Gleichzeitig schützt es den Code vor NullPointerExceptions. Eine bessere Implementierung würde Objekten, die nicht gleich unterschiedlicheN Hashcodes sind, wie diesen geben: Es ist erwähnenswert, dass EqualsVerifier sowohl die Equals()- als auch die hashCode()-Methoden testet. Okay, wenn gleich ist immer jetzt wahr?: Sie sagen im Grunde, dass alle Objekte als „logisch gleichwertig” zu einem anderen, so dass sie alle dem gleichen Bucket zuordnen (aufgrund des gleichen hashCode()), gleichen Eintrags. Im Allgemeinen funktioniert eine HashMap so: Sie hat eine variable Anzahl von sogenannten „Buckets”. Die Anzahl der Buckets kann sich im Laufe der Zeit ändern (wenn Einträge hinzugefügt und entfernt werden), aber es ist immer eine Leistung von 2.