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