Never Assume Anything:
First things first if you are writing a class whose equals method u have not overridden assumi ng that the equals method would never be called . never assume anything and atleast throw a UnsupportedOperationException to prevent others from doing a equality check on the instance of your class.
In terms of Code the equals method in your class should look like ,
Contract of Equals Method:
public boolean equals(Object other){
throw new UnsupportedOperationException();
}
The equals method must be
- reflexive
- transitive
- symmetric
- comapring with a null object should be false
public class Point {
private Object x;
public Point( Object x ) {
this.x = x;
}
public boolean equals(Object point){
if(point == this)
return true;
if(!point instanceof Point)
return false;
Point other = (Point) point;
boolean result = true;
result = result && (x == other.x || (x != null && x.equals(other.x)));
return result;
}
}
Now ok i ve implemented a hypothetical Point class that has only 1 member entity called x . That entity is an Object rather than being a primitive type.
if(point == this)
return true;
In this line i check the references are equals , if they are then can we can skip other checking cause basically they are the same two references .
if(!point instanceof Point)
return false;
Second we make sure the object that we are comparing against is of the same type and is not null . The not null is implicit in the behaviour of instanceof operator . The instanceof operator makes sure that object on the left is not null othwerise it returns false.
Point other = (Point) point;
Next we perform the casting to the type of this object so that we can check each and every field .
boolean result = true;
result = result && (x != null && x.equals(other.x));
Next since x is the field being used here , we check if x is not null and if its not null we see if its equal to the x field in the other Object.
return result;
Finally we return the result
No comments:
Post a Comment