Wie definiert man HashCode und equals für eine java.lang.ClassT?

8

Wenn Sie Class<T> als Teil eines Schlüssels eines Map verwenden müssen, was ist der richtige Weg, um hashCode und equals zu definieren?
A Class<T> erbt die von Object , die nach Referenzgleichheit suchen und die Speicheradresse als Hashcode zurückgeben, aber in meinen Augen ist nicht klar, was die sinnvolle Definition von equals und hashCode Definition eines% co_de ist %.
Sollte ich zum Beispiel Class<T> verwenden (wo wir theClass.getClass().hashCode(); haben), um die Methoden der tatsächlichen Instanz zu benutzen?
Aber das scheint nicht richtig zu sein.
Zum Beispiel in javadoc für Class<T> theClass; :

  

Jedes Array gehört auch zu einer Klasse, die als Klasse wiedergegeben wird   Objekt, das von allen Arrays mit demselben Elementtyp und geteilt wird   Anzahl der Dimensionen

So scheint es in einigen Fällen das gleiche Class<T> unter Objekten zu teilen? Also, was wäre der Weg zu folgen? Vielleicht verwenden Sie Class<T> und theClass.hashCode() , um die Referenzgleichheit zu verwenden? Nicht sicher hier.

    
Cratylus 16.09.2012, 12:34
quelle

2 Antworten

8

Die Implementierung von hashCode und equals java.lang.Class erbt von java.lang.Object ist sinnvoll und normalerweise angemessen, da alle Instanzen einer Klasse garantiert das gleiche Class -Objekt zurückgeben von getClass() , dh

%Vor%

Dies ist etwas in den Dokumenten vergraben; das javadoc von getClass () schreibt:

  

Rückgabe:

     

Das Klassenobjekt, das die Laufzeitklasse dieses Objekts darstellt.

     

Siehe auch:

     

Literale, Abschnitt 15.8.2 der Java ™ -Sprachspezifikation.

Dieser Abschnitt schreibt:

  

Ein Klassenliteral wertet das Klassenobjekt für den benannten Typ (oder für void) aus, wie es vom definierenden Klassenlader (§12.2) der Klasse der aktuellen Instanz definiert wird.

und Abschnitt 12.2 schreibt:

  

Gut funktionierende Klassenlader haben diese Eigenschaften:

     
  • Unter dem gleichen Namen sollte ein Lader einer guten Klasse immer das gleiche Klassenobjekt zurückgeben.
  •   
  • ...
  •   

Ein bösartiger Klassenlader könnte diese Eigenschaften verletzen. Es konnte jedoch die Sicherheit des Typsystems nicht untergraben, da die Java Virtual Machine dagegen wappnet.

Und wenn die gleiche Klassendefinition von verschiedenen Klassenladern geladen wird, sind die Klassenobjekte nicht gleich. Da die Runtime diese als unabhängige Klassen behandelt (die zufällig denselben Namen haben, aber ansonsten nicht ähnlich sein müssen, geschweige denn binär kompatibel), ist dies normalerweise erwünscht.

    
meriton 16.09.2012, 13:15
quelle
0

Die Methode String getName() gibt eine eindeutige String-Repräsentation der Klasse zurück. Sie können diese Zeichenfolge für equals / hashCode als normale Zeichenfolge verwenden, wenn Ihr Programm nicht mehr als einen Klassenlader verwendet.

    
m3th0dman 16.09.2012 12:59
quelle

Tags und Links