[ 
https://issues.apache.org/jira/browse/LANG-637?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13462087#comment-13462087
 ] 

Matt Benson commented on LANG-637:
----------------------------------

Again, from the usage standpoint I just envisioned that if I were getting diffs 
I might for some reason want to know at a code level precisely _in what manner_ 
two objects differed.  You are of course correct that ultimately the retrieval 
mechanism could really only be object-based, though we could do some generics 
tricks in that regard.  What about something like:

{code}
public abstract class Diff<T> extends oacl.tuple.Pair<T, T> {
  private final Type type;
  private final String fieldName;

  protected Diff(String fieldName) {
    this.type = 
ObjectUtils.defaultIfNull(TypeUtils.getTypeArguments(getClass(), 
Diff.class).get(Diff.class.getTypeParameters()[0]), Object.class);
  }

  public final Type getType() {
    return type;
  }

  public final String getFieldName() {
    return fieldName;
  }
}
{code}

{code}
public class DiffBuilder implements Builder<List<Diff>> {
  private final List<Diff> diffs = new ArrayList<Diff>();

  public List<Diff> build() {
    return Collections.unmodifiableList(new ArrayList<Diff>(diffs));
  }

  public DiffBuilder append(final String fieldName, final boolean lhs, final 
boolean rhs) {
    if ( /* different */ ) {
      diffs.add(new Diff<Boolean>(fieldName) {
        public Boolean getLeft() {
          return Boolean.valueOf(lhs);
        }
        public Boolean getRight() {
          return Boolean.valueOf(rhs);
        }
      });
    }
  }
}
{code}

The above example would avoid _storing_ your primitives as Objects, for 
whatever small additional storage costs that would have incurred.

$0.02,
Matt
                
> 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