...
Unfortunately, Collection
s and an Enumeration
s may fail to work well together. In fact, the Java API [API 2011] recommends, "New implementations should consider using Iterator
in preference to Enumeration
." Consequently, iterators rather than enumerators should be preferred when examining iterable collections.
Noncompliant Code Example
This noncompliant code example implements a BankOperations
class with a removeAccounts()
method used to terminate all the accounts of a particular account holder, as identified by the name. Names can be repeated in the vector if a person has more than one account. The remove()
method attempts to iterate through all the vector entries comparing each entry with the name "Harry."
...
Upon encountering the first "Harry," it successfully removes the entry, and the size of the vector diminishes to three. However, the index of the Enumeration
remains unchanged, causing the program to perform the next (now final) comparison with "Tom". Consequently, the second "Harry" remains in the vector unscathed, having shifted to the second position in the vector.
Compliant Solution
According to the Java API, Interface Iterator<E> documentation [API 2011],
...
Code Block | ||
---|---|---|
| ||
class BankOperations { private static void removeAccounts(Vector v, String name) { Iterator i = v.iterator(); while (i.hasNext()) { String s = (String) i.next(); if (s.equals(name)) { i.remove(); // Correctly removes all instances of the name Harry } } // Display current account holders System.out.println("The names are:"); i = v.iterator(); while (i.hasNext()) { System.out.println(i.next()); // Prints Dick, Tom only } } public static void main(String args[]) { List list = new ArrayList(Arrays.asList( new String[] {"Dick", "Harry", "Harry", "Tom"})); Vector v = new Vector(list); remove(v, "Harry"); } } |
Applicability
Using Enumeration
when performing remove operations on an iterable Collection
may cause unexpected program behavior.
Bibliography
[API 2011] | Interface Enumeration<E> Interface Iterator<E> |
[Daconta 2003] | Item 21, "Use Iteration over Enumeration" |
...