1 /* 2 * Copyright (c) 1994, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.util; 27 28 /** 29 * An object that implements the Enumeration interface generates a 30 * series of elements, one at a time. Successive calls to the 31 * <code>nextElement</code> method return successive elements of the 32 * series. 33 * <p> 34 * For example, to print all elements of a <tt>Vector<E></tt> <i>v</i>: 35 * <pre> 36 * for (Enumeration<E> e = v.elements(); e.hasMoreElements();) 37 * System.out.println(e.nextElement());</pre> 38 * <p> 39 * Methods are provided to enumerate through the elements of a 40 * vector, the keys of a hashtable, and the values in a hashtable. 41 * Enumerations are also used to specify the input streams to a 42 * <code>SequenceInputStream</code>. 43 * <p> 44 * NOTE: The functionality of this interface is duplicated by the Iterator 45 * interface. In addition, Iterator adds an optional remove operation, and 46 * has shorter method names. New implementations should consider using 47 * Iterator in preference to Enumeration. 48 * 49 * @see java.util.Iterator 50 * @see java.io.SequenceInputStream 51 * @see java.util.Enumeration#nextElement() 52 * @see java.util.Hashtable 53 * @see java.util.Hashtable#elements() 54 * @see java.util.Hashtable#keys() 55 * @see java.util.Vector 56 * @see java.util.Vector#elements() 57 * 58 * @author Lee Boynton 59 * @since 1.0 60 */ 61 public interface Enumeration<E> { 62 /** 63 * Tests if this enumeration contains more elements. 64 * 65 * @return <code>true</code> if and only if this enumeration object 66 * contains at least one more element to provide; 67 * <code>false</code> otherwise. 68 */ 69 boolean hasMoreElements(); 70 71 /** 72 * Returns the next element of this enumeration if this enumeration 73 * object has at least one more element to provide. 74 * 75 * @return the next element of this enumeration. 76 * @exception NoSuchElementException if no more elements exist. 77 */ 78 E nextElement(); 79 80 /** 81 * Returns an {@link Iterator} whose elements are the same as the 82 * elements of this {@code Enumeration}. The results are undefined 83 * if this method is called more than once, or if this Enumeration's 84 * other methods are called after {@code asIterator} has been called. 85 * 86 * @apiNote 87 * This method is intended to help adapt code that produces 88 * {@code Enumeration} instances to code that consumes {@code Iterator} 89 * or {@code Iterable} instances. For example, the 90 * {@link java.security.PermissionCollection PermissionCollection.elements()} 91 * method returns an {@code Enumeration<Permission>}. This can be adapted 92 * for use in an enhanced-for loop as follows: 93 * 94 * <pre>{@code 95 * PermissionCollection pc = ... ; 96 * Iterable<Permission> permsIterable = () -> pc.elements().asIterator(); 97 * for (Permission p : permsIterable) { 98 * doSomethingWithPermission(p); 99 * } 100 * }</pre> 101 * 102 * A {@code Stream<Permission>} could be created from an 103 * {@code Enumeration<Permission>} as follows: 104 * 105 * <pre>{@code 106 * Stream<Permission> permsStream = StreamSupport.stream( 107 * Spliterators.spliteratorUnknownSize( 108 * pc.elements().asIterator(), 109 * Spliterator.ORDERED | Spliterator.IMMUTABLE), 110 * false); 111 * }</pre> 112 * 113 * @implSpec 114 * The returned Iterator's {@link Iterator#hasNext hasNext} method calls and returns 115 * the value from this Enumeration's {@code hasMoreElements} method; its 116 * {@link Iterator#next next} method calls and returns the value from this Enumeration's 117 * {@code nextElement} method; and its {@link Iterator#remove remove} method throws 118 * {@code UnsupportedOperationException}. 119 * 120 * @return an Iterator derived from this Enumeration 121 * 122 * @since 1.9 123 */ 124 default Iterator<E> asIterator() { 125 return new Iterator<E>() { 126 @Override public boolean hasNext() { 127 return Enumeration.this.hasMoreElements(); 128 } 129 @Override public E next() { 130 return Enumeration.this.nextElement(); 131 } 132 }; 133 } 134 }