commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Julien Aymé (JIRA) <j...@apache.org>
Subject [jira] Commented: (LANG-394) Equalsbuilder fails at using unmodifiable collection
Date Thu, 03 Jan 2008 15:16:34 GMT

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

Julien Aymé commented on LANG-394:
----------------------------------

Hi, this is not an EqualsBuilder bug, but rather a misuse of the Collection interface:

The general contract for Collection#equals(Object) is the same as Object#equals(Object), ie
a Collection is only equals to itself.
(see http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#equals(java.lang.Object))

Whereas the contract for List#equals(Object) is that a List is equals to any List of the same
size which contains the same objects in the same order.
(see http://java.sun.com/j2se/1.5.0/docs/api/java/util/List.html#equals(java.lang.Object))

That's why your current test fails; instead of returning an unmodifiableCollection, try returning
an unmodifiableList (which compares to other lists by value and not by reference).

Hope this help,
Julien

> Equalsbuilder fails at using unmodifiable collection
> ----------------------------------------------------
>
>                 Key: LANG-394
>                 URL: https://issues.apache.org/jira/browse/LANG-394
>             Project: Commons Lang
>          Issue Type: Bug
>    Affects Versions: 2.3
>         Environment: Win XP SP2, JRE 1.5.0_12
>            Reporter: Benno Markiewicz
>
> When using the equalsbuilder to build a equals-method it comes to failures, when comparing
object which have unmodifiable list properties.
> Look at the simplified example. A class Foo with a collection (A,B,C) is build up. The
equals method uses the equalsbuilder to append the list to it. The getter of the list returns
a unmodifiable collection. This situation leads to the test failure. Without capsulation in
a unmodifiable collection the test succeeds. What's wrong? I want to compare such objects
by value not by reference.
>  @Test
>   public void testInEqualsBuilder() {
>     class Foo {
>       private final Collection<String> list;
>       public Foo() {
>         this.list = new ArrayList<String>();
>         this.list.add("A");
>         this.list.add("B");
>         this.list.add("C");
>       }
>       @Override
>       public boolean equals(final Object object) {
>         if (object == this) {
>           return true;
>         }
>         if (!(object instanceof Foo)) {
>           return false;
>         }
>         final Foo rhs = (Foo) object;
>         
>         final EqualsBuilder eb = new EqualsBuilder();
>         eb.append(this.list, rhs.getList());
>         return eb.isEquals();
>       }
>       private Collection<String> getList() {
>          return Collections.unmodifiableCollection(this.list);
>        }
>     }
>     final Foo x = new Foo();
>     assertTrue(x.equals(x));
>    
>     // FAILURE list [A,B,C] is not equal to list [A,B,C], when using
>     // unmodifiableCollection?
>     assertTrue(x.equals(new Foo()));
>   }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message