2010-10-13 22 views
3

Considérons l'exemple de code donné ci-dessous:Remplacer de l'égalité et hashCode pour la classe abstraite super

Résumé Nom

public abstract class Name { 
    private String name; 
public Name(String name) 
{ 
    this.name=name; 
} 
public String toString() 
{ 
    return name; 

} 
public String getName() { 
    return name; 
} 
} 

FirstName

public class FirstName extends Name { 

FirstName(String name) { 
    super(name); 
} 
public String toString() 
{ 
    return getName(); 
} 
} 

LastName

public class LastName extends Name{ 
LastName(String name) { 
super(name); 
} 
public String toString() 
{ 
return getName(); 
} 
} 

TestName

public class TestName { 
public static void main(String[] args) { 
Set<Name> names=new HashSet<Name>(); 
names.add(new FirstName("George")); 
names.add(new LastName("Bush")); 
names.add(new FirstName("Bush")); 
    System.out.println(names); 
} 
} 

Sortie

[Bush, Bush, George]

Maintenant, la question est de savoir comment passer outre hashcode et méthode de l'égalité telle que j'ai un seul nom "Bush" soit le prénom ou le nom de famille?

+0

Demandez-vous comment remplacer ces méthodes ou comment mettre en œuvre les remplacements pour faire ce que vous voulez? –

+0

Comment l'implémenter. – Emil

Répondre

4

Vous voulez probablement quelque chose comme ceci:

public boolean equals(Object obj) 
{ 
    if (obj == null) 
    return false; 
    if (!(obj instanceof Name)) 
    return false; 
    Name name = (Name) obj; 
    return this.name.equals(name.name); 
} 

public int hashCode() 
{ 
    return name.hashCode(); 
} 
+0

Cela devrait fonctionner: Un 'HashSet' ne rajoutera pas()' un objet s'il contient déjà un objet 'equals()'. – Jorn

+0

thnx cela fonctionne.juste modifier "! Obj instanceof Name" à "! (Obj instanceof Name)" – Emil

+0

un hashset ajoutera un élément seulement s'il n'y a pas un objet avec le même hashcode dans la collection, égal ne prend pas partie dans ce – Salandur

2

vous devez fournir une coutume méthode equals, pas par défaut. Par contrat, un Prénom et un Nom ne peuvent jamais être égaux, car il s'agit de 2 classes différentes (avec le même contenu dans ce cas).

edit: généré méthode equals d'éclipse:

public boolean equals(Object obj) 
{ 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Name other = (Name) obj; 
    if (name == null) 
    { 
     if (other.name != null) 
      return false; 
    } 
    else if (!name.equals(other.name)) 
     return false; 
    return true; 
} 
+0

Vous ne pouvez pas faire un getClass()! = obj.getClass () vérifier parce qu'il veut que le nom soit égal à un prénom. De plus, n'oubliez pas de toujours faire en sorte que le hashCode() fonctionne de la même manière que les égales() – Joshua

+0

les hashcodes doivent être identiques, lorsque equals renvoie true. mon hashcode calcule sa valeur en fonction du nom, donc ça marche. il n'y a pas de contrat de sorte que si les hascodes sont les mêmes, les égales doivent retourner vrai. il doit donc fournir une méthode equals personnalisée avec des contrôles si l'autre objet est un nom et a le même contenu. Prénom et Nom ne fournissent pas d'informations supplémentaires, ils sont donc redondants. – Salandur