[Fwd: Code review request: 7072353 JNDI libraries do not build with javac -Xlint:all -Werror]

Alexandre Boulgakov alexandre.boulgakov at oracle.com
Wed Aug 3 14:14:22 PDT 2011


Users of Iterable expect to call Iterable.iterator() multiple times, 
receiving a fresh iterator pointing to the beginning of the Iterable 
each time. This would not be possible to do with an Enumeration wrapper 
since Enumerations are read-once.

I don't know if this is a strong enough reason not to include such a 
utility class, but it could certainly be confusing.

-Sasha

On 8/3/2011 2:09 PM, Neil Richards wrote:
> On Wed, 2011-08-03 at 11:03 -0700, Alexandre Boulgakov wrote:
>> Please see my responses inline.
>>
>> Thanks!
>> -Sasha
>>
>> On 8/2/2011 9:13 PM, Xuelei Fan wrote:
>>> . com/sun/jndi/toolkit/dir/SearchFilter.java
>>>    451         for (NamingEnumeration<?>   ve = attr.getAll();
>>>    452              ve.hasMore();
>>>    453                ) {
>>>
>>> The update is OK. But the coding style looks uncomfortable. Would you
>>> mind change it to use for-each style?
>> For-each only works with Iterables. There doesn't seem to be a way to
>> get an Iterable out of an Attribute instance, so the only way to use a
>> for-each here would be to wrap the Enumeration in an ArrayList using
>> Collections.list(). While this might look neater, the contents of the
>> Enumeration would have to be copied over, using time and increasing the
>> memory footprint. Changing Attribute to implement Iterable would require
>> a spec change, and would be beyond the scope of this fix.
> Would it  be useful to have a utility object to convert an Enumeration
> so it can be used in for-each constructs? - something like:
> ----
>          import java.util.Enumeration;
>          import java.util.Iterator;
>
>          /**
>           * Utility class to transform an Enumeration object such that it can be used in
>           * the for-each construct.
>           */
>          public class IterableEnumerationHolder<E>  implements Iterable<E>, Iterator<E>  {
>              private final Enumeration<E>  e;
>
>              public IterableEnumerationHolder(final Enumeration<E>  e) {
>                  this.e = e;
>              }
>
>              @Override
>              public Iterator<E>  iterator() {
>                  return this;
>              }
>
>              @Override
>              public boolean hasNext() {
>                  return e.hasMoreElements();
>              }
>
>              @Override
>              public E next() {
>                  return e.nextElement();
>              }
>
>              @Override
>              public void remove() {
>                  throw new UnsupportedOperationException();
>              }
>          }
> ----
>
> If it would, perhaps it might be considered for Java 8?
>
> Regards,
> Neil
>



More information about the security-dev mailing list