1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | package Torello.Java.Additional; import java.util.Iterator; /** * This functions identically to the normal {@code Iterator<E>} class, but prevents * <CODE>Iterator.remove()</CODE> from ever being invoked. It does not seem clear why such an * option is not included for the standard {@code Iterator} producing methods in java. There are * many times when an {@code Iterator} of the contents of a {@code Vector} would be useful, but * allowing the user to modify the contents would not be. * * @param <E> The type that this {@code Iterator} will iterate. */ public class RemoveUnsupportedIterator<E> implements Iterator<E> { /** This class just wraps a standard java iterator */ private final Iterator<E> iterator; /** * This constructor is the only offered constructor. All it does is "wrap" one iterator that * throws the {@code UnsupportedOperationException} if a user attempts to invoke the * {@code 'remove()'} method. * @param iterator This should be any java iterator. Regardless of whether this iterator * already throws the UnsupportedOperationException on an invocation of the 'remove()' method, * this class will guarantee that the exception is thrown. */ public RemoveUnsupportedIterator(Iterator<E> iterator) { this.iterator = iterator; } /** * This is a standard Java Iterator-provided method. * @param action This (<B><I>should</I></B>) accept an instance of the {@code 'Consumer<E>'} * functional interface, but indeed it uses a "Raw-Type" and will accept any instance of * class {@code 'Consumer'}. * * @throws ClassCastException This will throw if you "screw it up" (and pass a consumer that * cannot accept variable type {@code 'E'}. This will throw at RunTime, and there is no way * to check this at compile-type, unfortunately. * <BR /><BR />Lucky for you, it is extremely unlikely you would ever need to invoke this * method on a {@code 'RemoveUnsupportedIterator'}. Have a nice day! */ @SuppressWarnings("unchecked") public void forEachRemaining(java.util.function.Consumer<? super E> action) { this.iterator.forEachRemaining(action); } /** * This method is identical to the standard java iterator {@code 'hasNext()'} method. * It merely invokes {@code 'hasNext()'} on the internally stored reference to the original * {@code Iterator} reference. ( * @return This will return {@code TRUE} if the internally stored iterator reference has more * elements to return. It will return {@code FALSE} otherwise. */ public boolean hasNext() { return this.iterator.hasNext(); } /** * This method is identical to the standard java iterator {@code 'next()'} method. * It merely invokes {@code 'next()'} on the internally stored reference to the original * {@code Iterator} reference. * * @return returns the next element available. */ public E next() { return this.iterator.next(); } /** * This ensures that any attempt to modify the internal data structure will cause the * {@code Iterator} to throw {@code 'UnsupportedOperationException'} to throw. * * @throws UnsupportedOperationException If this method is invoked for any reason, and under * any circumstances. */ public final void remove() { throw new UnsupportedOperationException("Remove Operation is not supported."); } } |