Gilles Sadowski created LANG-1708:
-------------------------------------

             Summary: Usage of "ReflectionDiffBuilder"
                 Key: LANG-1708
                 URL: https://issues.apache.org/jira/browse/LANG-1708
             Project: Commons Lang
          Issue Type: Wish
          Components: lang.builder.*
    Affects Versions: 3.13.0
            Reporter: Gilles Sadowski
             Fix For: 3.14.0


If we have either this class
{code}
    private static class MyDirect {
        private float value;

        MyDirect(float a) {
            value = a;
        }
    }
{code}
or this class
{code}
    private static class MyReference {
        private MyDirect value;

        MyReference(float a) {
            value = new MyDirect(a);
        }
    }
{code}
it could be argued that they are _functionally_ equivalent; IOW, code that uses 
one or the other (say, via a library) would consider it an implementation 
detail (e.g. if that library changed one for the other in some internal object).

[{{ReflectionDiffBuilder}}|https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ReflectionDiffBuilder.html]
 however behaves differently: Two instances with the same information contents 
(a primitive {{float}} value, from the caller POV) are considered the same in 
the former case and *not the same* in the latter.

It will be noted that neither class defines an {{equals(Object)}} method; were 
it the case, the documentation of {{ReflectionDiffBuilder}} 
[constructor|https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ReflectionDiffBuilder.html#ReflectionDiffBuilder-T-T-org.apache.commons.lang3.builder.ToStringStyle-]
 says:
{noformat}
If lhs == rhs or lhs.equals(rhs) then the builder will not evaluate any calls 
to append(...) and will return an empty DiffResult when build() is executed.
{noformat}

However there are the use-cases
# (as above) where {{equals}} was not overridden (and the source code cannot be 
modified by the user who wants to list the differences, or ensure there are 
none, functionally), and
# where one would want to list (potential) differences that could exist even if 
{{equals}} would return {{true}} (e.g. if {{equals}} is buggy).

IMHO:
* Current behaviour is inconsistent (even if intended).
* There should be a way to disable the equality check (i.e. *always* use 
reflection to list the differences).




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to