Override peers and hashCode for abstract superclass

Consider the code example below:

Abstract name

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();
}
}

ASMAP

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);
}
}

Output

[Bush, Bush, George]

Now the question is how to override hashcode and the equal method, so that I only have one name “Bush” either as a first name or last name?

+3
source share
2 answers

You probably want something like this:

 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();
 }
+4
source

you must specify your own equals method, not the standard one. by contract, FirstName and LastName can never be equal, because they are 2 different classes (with the same content in this case).

edit: equals eclipse:

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;
}
+2

Source: https://habr.com/ru/post/1769334/


All Articles