You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Henri Yandell (JIRA)" <ji...@apache.org> on 2010/01/16 09:50:54 UTC

[jira] Commented: (LANG-544) ToStringStyle.registry ThreadLocal initialValue should return a Set that implements reference equality checking instead of object equality

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

Henri Yandell commented on LANG-544:
------------------------------------

If we're unable to move to JDK 1.6, a possibility is implementing Collections.newSetFromMap(Map) in Lang.

Alternatively, implement an IdentityHashSet (rough draft):

{code:java}
package org.apache.commons.lang3.collections;

import java.util.AbstractSet;
import java.util.Collection;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Iterator;

public class IdentityHashSet<E> extends AbstractSet<E> {

    private IdentityHashMap<E, E> decorated;

    public IdentityHashSet() {
        super();
    }

    public IdentityHashSet(Collection<E> collection) {
        if (collection != null) {
            HashMap<E, E> map = new HashMap<E, E>();
            for (E element : collection) {
                map.put(element, element);
            }
            decorated = new IdentityHashMap<E, E>(map);
        } else {
            decorated = new IdentityHashMap<E, E>();
        }
    }

    public int size() {
        return decorated.size();
    }

    public Iterator<E> iterator() {
        return decorated.keySet().iterator();
    }

    public boolean add(E element) {
        if (decorated.contains(element) ) {
            return false;
        } else {
            decorated.put(element, element);
            return true;
        }
    }
}
{code}

> ToStringStyle.registry ThreadLocal initialValue should return a Set that implements reference equality checking instead of object equality
> ------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: LANG-544
>                 URL: https://issues.apache.org/jira/browse/LANG-544
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.builder.*
>    Affects Versions: 2.4
>            Reporter: Michael Richards
>             Fix For: 3.0
>
>
> ToStringStyle.registry ThreadLocal initialValue should return a Set that implements reference equality checking instead of object equality.
> This change would still protect against cyclical object graphs, but also protect against the following conditions:
> * Incorrect implementations of hashCode/equals for any objects in the object graph
> * Unintended side effects of the hashCode/equals methods for any objects in the object graph
> Unfortunately, Java versions prior to 1.6 do not provide a simple built-in mechanism to create such a Set.  This issue is discussed here in detail:
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479578
> A possible work-around is to use an IdentityHashMap instead of a Set.  This class is available in Java 1.4 and later.

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