[
https://issues.apache.org/jira/browse/COLLECTIONS-441?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13569649#comment-13569649
]
Thomas Vahrst commented on COLLECTIONS-441:
-------------------------------------------
In the suggested solution, the decorated map itself (an AbstractHashedMap
instance) is cloned and then filled into the new MultiKeyMap instance. The
clone() method of AbstractHashedMap contains another findbugs issue: it returns
null in the case of a CloneNotSupportedException:
{quote}
org.apache.commons.collections.map.AbstractHashedMap.clone() may return null
{quote}
Instead of returning null, throwing a RuntimeException makes findbugs happy ;-)
{code}
/**
* Clones the map without cloning the keys or values.
* <p>
* To implement <code>clone()</code>, a subclass must implement the
* <code>Cloneable</code> interface and make this method public.
*
* @return a shallow clone
*/
@Override
@SuppressWarnings("unchecked")
protected AbstractHashedMap<K, V> clone() {
try {
final AbstractHashedMap<K, V> cloned = (AbstractHashedMap<K, V>)
super.clone();
cloned.data = new HashEntry[data.length];
cloned.entrySet = null;
cloned.keySet = null;
cloned.values = null;
cloned.modCount = 0;
cloned.size = 0;
cloned.init();
cloned.putAll(this);
return cloned;
} catch (final CloneNotSupportedException ex) {
// return null; // should never happen.
throw new RuntimeException(ex); // should never happen.
}
}
{code}
> MultiKeyMap.clone() should call super.clone()
> ---------------------------------------------
>
> Key: COLLECTIONS-441
> URL: https://issues.apache.org/jira/browse/COLLECTIONS-441
> Project: Commons Collections
> Issue Type: Improvement
> Components: Map
> Affects Versions: 4.0-beta-1
> Reporter: Thomas Vahrst
> Priority: Minor
>
> This issue addresses a findbugs issue:
> {quote}
> org.apache.commons.collections.map.MultiKeyMap.clone() does not call
> super.clone()
> {quote}
> The current clone() implementation creates a new MultiKeyMap instance. This
> will lead to problems when clone() is invoked on subclasses of MultiKeyMap.
> This is a corresponding junit test which fails:
> {code}
> class MultiKeyMapTest
> // Subclass to test clone() method
> private static class MultiKeyMapSubclass extends MultiKeyMap<String,
> String>{
> }
> public void testCloneSubclass(){
> MultiKeyMapSubclass m = new MultiKeyMapSubclass();
>
> MultiKeyMapSubclass m2 = (MultiKeyMapSubclass) m.clone();
>
> }
> {code}
> Instead of creating a new MultiKeyMap instance, the clone() method should
> invoke super.clone() which leads in Object.clone(). This always returns an
> object of the correct type.
> {code}
> class MultiKeyMap{
> /**
> * Clones the map without cloning the keys or values.
> *
> * @return a shallow clone
> */
> @Override
> public MultiKeyMap<K, V> clone() {
> try {
> MultiKeyMap<K,V> m = (MultiKeyMap<K, V>) super.clone();
> AbstractHashedMap<MultiKey<? extends K>, V> del =
> (AbstractHashedMap<MultiKey<? extends K>, V>)decorated().clone();
>
> m.map = del;
> ((AbstractMapDecorator<K,V>)m).map = (Map) del;
> return m;
> } catch (CloneNotSupportedException ex) {
> throw new RuntimeException (ex); // this should never happen...
> }
> }
> {code}
> *Note*
> For serialisation compatibilty reasons to commons collections V.3.2,
> MultiKeyMap contains a map reference (the decorated map) which hides the same
> field in the super class AbstractMapDecorator. This is quite 'ugly' to
> understand and maintain.
> Should we consider to break the compatibility to the 3.2 version?
--
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