[ 
https://issues.apache.org/jira/browse/LANG-637?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Duncan Jones updated LANG-637:
------------------------------

    Attachment: DifferenceBuilderTest.java
                Differentiable.java
                DifferenceBuilder.java

I've begun work on an implementation of this feature, attached are some partial 
files. I would love some thoughts on whether the approach is sensible. Note 
that a reflection based builder would be required, but is not yet sketched out.

I have defined a new interface, {{Differentiable<T>}}, that is similar to 
{{Comparable<T>}}. The {{DifferenceBuilder}} will test user-chosen fields for 
equality (much like {{EqualsBuilder}}) and will append any differing fields an 
internal {{ToStringBuilder}} (one for each object). The {{build()}} method will 
either return an empty string if the tested fields were equal, or a string of 
the form:

{noformat}[LHS Object] differs from [RHS Object]{noformat}

(where the objects are printed using the {{ToStringBuilder}} and a user-chosen 
style).

Expected usage is as follows (taken from JavaDoc):

{code}
public class Person implements Differentiable<Person> {
  String name;
  int age;
  boolean smoker;
  
  ...
  
  public String differentiateFrom(Person obj) {
    // No need for null check, as NullPointerException correct if obj is null
    return new DifferenceBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE)
      .append("name", this.name, obj.name)
      .append("age", this.age, obj.age)
      .append("smoker", this.smoker, obj.smoker)
      .build();
  }
}
{code}

If the design appeals, I'll continue with the leg-work and add all the 
necessary method overloads and additional constructors etc. I can then post an 
update for a more detailed review.
                
> There should be a DifferenceBuilder with a ReflectionDifferenceBuilder 
> implementation
> -------------------------------------------------------------------------------------
>
>                 Key: LANG-637
>                 URL: https://issues.apache.org/jira/browse/LANG-637
>             Project: Commons Lang
>          Issue Type: Improvement
>          Components: lang.builder.*
>            Reporter: Eric Lewis
>            Priority: Minor
>             Fix For: 3.x
>
>         Attachments: DifferenceBuilder.java, DifferenceBuilderTest.java, 
> Differentiable.java
>
>
> The ToStringBuilder and ReflectionToStringBuilder are great tools for 
> everyday development.
> We use them to show all the properties in an object, which comes handy 
> especially for testing.
> However, JUnit with its assertEquals() just outputs the toString() of the two 
> compared objects. For complex objects, this becomes unreadable.
> So, it would be great to have a DifferenceBuilder with a 
> ReflectionDifferenceBuilder implementation to be able to get only the 
> differing properties of two objects. The question is whether the two objects 
> would have to be of the same type or not.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to