2016-03-19 10 views
1

Ich sah zwei verschiedene Version diesen Code, einen von Java Oralce und den anderen von Youtube. Der einzige Unterschied zwischen den beiden Versionen ist der Parametertyp der equals() -Methode. Einer davon ist equals(Object o), während der andere equals(Name o) ist. Ich habe mich nur gefragt, ob es einen sinnvollen Unterschied zwischen den beiden Versionen gibt? Wenn ja, welche Auswirkung hat es? Danke für jede Hilfe, die ich bekommen konnte!Gibt es irgendeinen bedeutungsvollen Unterschied zwischen Gleichem (Objekt o) und Gleichem (Name o)? Wenn ja, welche Implikation hat es?

public class Name implements Comparable<Name> { 
    private final String firstName, lastName; 

    public Name(String firstName, String lastName) { 
     if (firstName == null || lastName == null) 
      throw new NullPointerException(); 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String firstName() { return firstName; } 
    public String lastName() { return lastName; } 

    public boolean equals(Object o) { 
     if (!(o instanceof Name)) 
      return false; 
     Name n = (Name) o; 
     return n.firstName.equals(firstName) && n.lastName.equals(lastName); 
    } 

    public int hashCode() { 
     return 31*firstName.hashCode() + lastName.hashCode(); 
    } 

    public String toString() { 
    return firstName + " " + lastName; 
    } 

    public int compareTo(Name n) { 
     int lastCmp = lastName.compareTo(n.lastName); 
     return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName)); 
    } 
} 
+2

Um 'equals' zu überschreiben, muss der Parameter ** **' 'Objekt' 'sein, nicht etwas anderes. Sonst * überlädst du *, überschreibst nicht, und das falsche 'equals' wird in verschiedenen Kontexten aufgerufen. Die verknüpfte Frage und ihre Antworten (und einige andere hier auf SO) haben Details. –

Antwort

3

equals(Object o) überschreibt Object ‚s equals Methode während equals(Name o) nicht. Wenn die Klasse Name mit einer Klasse verwendet wird, die equals verwendet (z. B. HashSet<Name>, ArrayList<Name> usw.), sollten Sie equals(Object o) implementieren, wenn Sie die Standardlogik für die Ermittlung von zwei gleichwertigen Objekten überschreiben möchten miteinander (das Standardverhalten ist das a.equals(b) wenn a==b).

Zum Beispiel wird der folgende Code erzeugt die Ausgabe 2 wenn equals(Name o) implementiert ist (da entsprechend die Standardimplementierung von equals(Object o) die beiden Objekte in die Set hinzugefügt zueinander nicht gleich sind), und 1 wenn equals(Object o) implementiert als in Ihrem Codebeispiel (da gemäß Ihrer Implementierung von equals(Object o) die beiden Objekte, die zu Set hinzugefügt wurden, einander gleich sind und HashSet Dubletten verhindert).

Set<Name> names = new HashSet<>(); 
names.add(new Name("John","Smith")); 
names.add(new Name("John","Smith")); 
System.out.println(names.size());