This fixes a couple bugs in EnumMap. One is that EnumMap.get() will return the empty slot object. Oops. This is PR java/32862.
The other is that EnumMap.clone() calls new. This is only correct when a class (or clone itself) is final. I looked but did not see other instances of this bug in java.util. Tom Index: ChangeLog from Tom Tromey <[EMAIL PROTECTED]> PR java/32862: * java/util/EnumMap.java (get): Special case emptySlot. (clone): Rewrote. Index: java/util/EnumMap.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/EnumMap.java,v retrieving revision 1.4 diff -u -r1.4 EnumMap.java --- java/util/EnumMap.java 21 Dec 2006 13:02:50 -0000 1.4 +++ java/util/EnumMap.java 24 Jul 2007 15:24:10 -0000 @@ -1,5 +1,5 @@ /* EnumMap.java - Map where keys are enum constants - Copyright (C) 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -140,7 +140,8 @@ Enum<K> e = (Enum<K>) key; if (e.getDeclaringClass() != enumClass) return null; - return store[e.ordinal()]; + V o = store[e.ordinal()]; + return o == emptySlot ? null : o; } public V put(K key, V value) @@ -387,8 +388,18 @@ public EnumMap<K, V> clone() { - /* This constructor provides this functionality */ - return new EnumMap(this); + EnumMap<K, V> result; + try + { + result = (EnumMap<K, V>) super.clone(); + } + catch (CloneNotSupportedException ignore) + { + // Can't happen. + result = null; + } + result.store = store.clone(); + return result; } }