package java.util; public class Collections { private Collections() { } static class IteratorEnumeration implements Enumeration { private final Iterator it; public IteratorEnumeration(Iterator it) { this.it = it; } public T nextElement() { return it.next(); } public boolean hasMoreElements() { return it.hasNext(); } } static class SynchronizedCollection implements Collection { private final Object lock; private final Collection collection; public SynchronizedCollection(Object lock, Collection collection) { this.lock = lock; this.collection = collection; } public synchronized int size() { synchronized (lock) { return collection.size(); } } public synchronized boolean contains(T e) { synchronized (lock) { return collection.contains(e); } } public synchronized boolean add(T e) { synchronized (lock) { return collection.add(e); } } public synchronized boolean remove(T e) { synchronized (lock) { return collection.remove(e); } } public synchronized void clear() { synchronized (lock) { collection.clear(); } } public Iterator iterator() { return new SynchronizedIterator(lock, collection.iterator()); } } static class SynchronizedSet extends SynchronizedCollection implements Set { public SynchronizedSet(Object lock, Set set) { super(lock, set); } } static class SynchronizedIterator implements Iterator { private final Object lock; private final Iterator it; public SynchronizedIterator(Object lock, Iterator it) { this.lock = lock; this.it = it; } public T next() { synchronized (lock) { return it.next(); } } public boolean hasNext() { synchronized (lock) { return it.hasNext(); } } public void remove() { synchronized (lock) { it.remove(); } } } static class ArrayListIterator implements Iterator { private final List list; private boolean canRemove = false; private int index = -1; public ArrayListIterator(List list) { this.list = list; } public T next() { if (hasNext()) { canRemove = true; return list.get(++index); } else { throw new NoSuchElementException(); } } public boolean hasNext() { return index + 1 < list.size(); } public void remove() { if (canRemove) { canRemove = false; list.remove(index--); } else { throw new IllegalStateException(); } } } }