Implementing hashcode and equals for custom classes

abstract-data-type, custom-object, equals, hashcode, java

Solution

Equals and hashCode contract in Java:

We must override hashCode() when we override equals() method, equals method in Java must follow its contract with hashCode method in Java as stated below.

- If two objects are equal by equals() method then there hashcode must be same.

- If two objects are not equal by equals() method then there hashcode could be same or different.

These are sample implementation of equals and hashcode methods for your class:

 //Hashcode Implementation    

   @Override
    public int hashCode() 
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + (isActive ? 1231 : 1237);
        result = prime * result + (wasActive ? 1231 : 1237);
        return result;
    }

//equals Implementation    
    @Override
    public boolean equals(Object obj) 
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Cell other = (Cell) obj;
        if (isActive != other.isActive)
            return false;
        if (wasActive != other.wasActive)
            return false;
        return true;
    }

Problem

So I have many custom classes are also have custom clases inside of them using composition. My custom classes have variables that change very frequently and I add them to HashSets. So my question is when I implement hashCode - what should I do for a class that only has private fields that constantly change? Here is an example of one custom class: ``` public class Cell { protected boolean isActive; protected boolean wasActive; public Cell() { this.isActive = false; this.wasActive = false; } // getter and setter methods... @Override public int hashCode() { // HOW SHOULD I IMPLEMENT THIS IF THIS custom object is constantly // being added into HashSets and have it's private fields isActive // and wasActive constantly changed. } // ANOTHER QUESTION Am I missing anything with this below equals implementation? @Override public boolean equals(Object object) { boolean result = false; if (object instanceof Cell) { Cell otherCell = (Cell) object; result = (this.isActive == otherCell.isActive && this.wasActive == otherCell.wasActive); } return result; } ```

Original source