I have a simple base class, which is later extended by many separate classes, which potentially introduce new fields, but not necessarily. I defined an equals method in the base class, but also overriden that for a few subclasses. Is it OK to mix definitions in base/subclasses? In my case it was to avoid code duplication checking the same fields.
Share
Take a look at “Implementing equals() To Allow Mixed-Type Comparison” from Angelika Langer .
Here is a brief explanation of some problems and a possible solution:
The equals contract says (amongst others):
That means you might get problems if your sub class is introducing new fields and you’re comparing an object of the base class (or another sub class that doesn’t override equals) to an object of this sub class.
Do NOT do the following:
because you get
A possible solution:
Replace the
instanceof-check with a class comparison:With this solution an object of
BaseClasswill never be equal to an object of any subclass.If you create another
SubClasswithout an@Overrideof theequalsmethod, twoSubClass-objects can be equal to each other (if theBaseClass.equalscheck decides so) out of the box, but aSubClass-object will never be equal to aBaseClass-object.A good implementation could be as follows:
Please refer to the article mentioned above for more advanced problems and their solutions.