2010-06-02 6 views
7

Wenn ein Objekt einen eindeutigen Primärschlüssel enthält, welche Schnittstellen muss es implementieren, um sammlungfreundlich zu sein, insbesondere in Bezug auf die Fähigkeit, effizient sortierbar, hashbar, etc ...?Java - Machen Sie eine Objektsammlung freundlich

Wenn der Primärschlüssel eine Zeichenfolge ist, wie werden diese Schnittstellen am besten implementiert?

Danke!

Antwort

9

Sie müssen Object.equals() und Object.hashCode() außer Kraft setzen und auch die Schnittstelle Comparable implementieren. Dies macht Ihre Klasse vollständig "konform", wenn Sie irgendeine Art von Sortierung oder Hashing durchführen, einschließlich der Verwendung von Collections.sort(, einer beliebigen Map Klasse oder einer beliebigen Set Klasse. Wenn es sogar eine winzige Chance gibt, dass die Klasse in eine Art Sammlung gelegt wird, dann sollte es definitiv implementieren alle drei dieser Methoden.

public class A implements Comparable<A>{ 
    private String key; 

    @Override 
    public boolean equals(Object obj){ 
     if (this == obj) return true; 
     if (!(obj instanceof A)) return false; 

     A that = (A)obj; 
     return this.key.equals(that.key);  
    } 

    @Override 
    public int hashCode(){ 
     return key.hashCode(); 
    } 

    @Override 
    public int compareTo(A that){ 
     //returns -1 if "this" object is less than "that" object 
     //returns 0 if they are equal 
     //returns 1 if "this" object is greater than "that" object 
     return this.key.compareTo(that.key); 
    } 
} 

Denken Sie daran, dass, wenn zwei Objekte gleich sind, dann gilt:

  1. ihre Codes Hash auch gleich sein müssen und
  2. compareTo() 0.
12

Sie müssen equals, hashCode implementieren und (nach Implementierung der Schnittstelle Comparable) compareTo.

Da Sie in jedem Fall eine Zeichenfolge haben, die ein Primärschlüssel ist, können Sie diese Aufrufe einfach an Ihre Zeichenfolge senden. Zum Beispiel:

public class Friendly implements Comparable<Friendly> 
{ 
    // presumably you've got other fields as well 
    private String primaryKey; 
    public Friendly(String primaryKey) 
    { 
     this.primaryKey = primaryKey; 
    } 

    public int compareTo(Friendly other) 
    { 
     return primaryKey.compareTo(other.primaryKey); 
    } 

    public int hashCode() 
    { 
     return primaryKey.hashCode(); 
    } 

    public boolean equals(Object o) 
    { 
     return (o instanceof Friendly) && primaryKey.equals(((Friendly)o).primaryKey); 
    } 
} 
+3

zurückkehren müssen und sicherstellen, dass compareTo entspricht dem "equals" -Vertrag. – duffymo

+2

Und dass gleiche Objekte gleiche Hashcodes haben. – CurtainDog

5

Strings sind bereits sehr gut geeignet für Hashing und Vergleich, so dass, wenn Ihre Objekte wirklich eindeutig durch Strings identifiziert werden können, dann sind Sie in guter Form. Stellen Sie sicher, dass Sie die Schnittstelle Comparable zum Sortieren und Überschreiben von equals und hashCode (Delegieren in die Primärschlüsselzeichenfolge) für das Hashing implementieren, und Sie können loslegen.

3

Wenn der Primärschlüssel ein Object10 ist, müssen Sie entscheiden, ob die Sortierreihenfolge auf Object oder Object Primärschlüssel Object basiert.

In beiden Fällen sollte der zu sortierende Artikel die Schnittstelle Comparable mit einer geeigneten compareTo()-Methode implementieren. Die Odds sind exzellent, das heißt, Sie müssen auch equals() und hashCode() überschreiben, da nur einige der Primärschlüssel-Objekte wahrscheinlich über geeignete Standardimplementierungen verfügen.

Wenn Sie basierend auf einer nicht natürlichen Sortierreihenfolge sortieren möchten, implementieren Sie auch ein paar "extra" Comparators. Bestellt Collections Unterstützung Alternative Comparators.