You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Miguel Munoz <sw...@yahoo.com.INVALID> on 2019/06/02 08:24:22 UTC

[lang] New approach to tackle issue LANG-332: EqualsBuilder to alternatively use method properties

I have a new approach to write a reflection-equals utility that will likely execute noticeably faster than the current approach. It will also let us add new strategies, such as an EqualsBuilder to use method properties, as requested in issue LANG-332. It will also allow us to add whatever other new strategies developers may propose.
A class that uses my new approach to determine equality and return hash codes might look something like this:
     public class Widget implements Comparable<Widget> {         // Fields, properties, and methods go here           private static final Reflector<Widget> reflector = Reflector.buildPropertyReflector(Widget.class)                 .includeTransientProperties(trPropertyName1, trPropertyName2)                 .exclude(propertyName1)                 .build();
           @Override public boolean equals(Object other) {             return reflector.doEquals(this, other);         }           @Override public int hashCode() {             return reflector.doHashCode(this);         }     }

There are three main advantages to doing it this way:
1. By creating the reflector class at class-load time, we speed up the process of comparing the instances. With the current EqualsBuilder class, much of the work to implement equals() gets duplicated each time it gets called.
2. It simplifies the user's task of writing the equals method. The user no longer needs to start each equals() method like this:
  public boolean equals(Object obj) {        if (obj == null) { return false; }       if (obj == this) { return true; }        if (obj.getClass() != getClass()) {        return false;                          }      ...  }                                  
  Instead, all this work will be done in the call to reflector.doEquals(this, other)
3. The approach will make it easier to add new strategies. The example above calls the buildPropertyReflector() method. Other methods may be written to implement other approaches. For example, another strategy could be added that would also generate a compareTo() method, to implement the Comparable implementation that's consistent with equals() and hashCode(). This would probably involve annotations that can be used to specify the comparison order of the various fields or properties.
I've written a class like this before, so I know it works, and I know the pitfalls. In short, I would like you to assign the LANG-332 task to me.
-- Miguel Muñoz