Java compare objects: using reflection?

I have an object that itself has multiple objects as fields. The question I have is, I have two objects of this type, and I want to compare these two. I know I can do equals, comparators, etc., but is there a way to use reflection to get the properties of an object and do the comparison.

for example if I have a Car object which is like a wheel object which has a tire object which has bolts object. Remember that all the listed objects are separate and not nested classes. How to compare 2 cars?

Any help is appreciated?

thank

+2


source to share


4 answers


public class Car {
  private Wheels wheels;
  // other properties

  public boolean equals(Object ob) {
    if (!(ob instanceof Car)) return false;
    Car other = (Car)ob;
    // compare properties
    if (!wheels.equals(other.wheels)) return false;
    return true;
  }
}

      

- the right approach. Automatic comparison via reflection is not recommended. On the one hand, "state" is a more general concept than reflected property mapping.



You could write something that did a deep reflection, but that didn't miss the point.

+8


source


Apache Commons Lang has EqualsBuilder that does exactly that (see methods reflectionEquals()

)

 public boolean equals(Object obj) {
   return EqualsBuilder.reflectionEquals(this, obj);
 }

      



EqualsBuilder

also provides more explicit methods for null-safe comparison of specific fields, making it a little less cumbersome to write the "correct" (that is, non-reflective) equivalent technique.

+16


source


Most modern IDEs have generators for hashcodes and equals that allow you to select the properties to be considered. They easily handle the work of their reflective colleagues.

+2


source


An interesting idea, but please remember that reflections can be slow. If you need to make a lot of comparisons, or do you put your items in the collection classes that perform the comparison (eg HashMap

, HashSet

etc.), the comparison of objects through the reflection can be a performance bottleneck.

0


source







All Articles