One more proposal for "Collections": constantSized[List|Map]

assembling signals assembling.signals at yandex.ru
Sat Apr 17 18:05:50 UTC 2010


Hello, everyone!

My next proposal for the "Collections" utility class is a bunch of methods (similar to unmodifiable[...])
which would return not an unmodifiable List|Map|Set, but a constant-sized one.
That is, all methods which get|set|... elements would work as earlier, but methods which
would alter the size of the underlying collection (add|put|remove|retain|...) would throw UnsupportedOperationException.

So the new logic hoerarchy would be:
1) Unmodifiable[something] -- very strict
2) ConstantSized[something] -- less strict
3) [Usual collections]

A constant-sized-list would be nearly same as an unmodifiable-list, with the exception that set(int index)
would be allowed.
A constant-sized-map would be nearly same as an unmodifiable-map, with the exception that put(K key, V value) on EXISTING
keys would be allowed.

I have no opinion of the usability of this proposal for Maps or Sets (it could make sense, but it could make none).
But I am very sure, that for Lists it is very useful.

What do you think of such a proposal? Not too specific? I, for myself, need such constant-sized collections often.

( I don't know about the name. ConstantSized[...]? NonResizable[...]? Sealed[...]? )

Please take a look at a proposal for a ConstantSizedList:

import java.util.*;

/**
 * Wrapps around an ArrayList and prevents all resizing methods by throwing
 * an UnsupportedOperationException. The underlying ArrayList still may be changed.
 *
 * The underlying ArrayList is sealed by following means:
 * - methods which return an iterator use Collections.unmodifiableList(...);
 * - adding, clearing, removing, retaining methods throw UnsupportedOperationException;
 * - all other methods are delegated to the underlying ArrayList.
 */
public final class ConstantSizeArrayList<T>
		implements List<T>, RandomAccess, Cloneable {

	private final static RuntimeException ex =
			new UnsupportedOperationException(ConstantSizeArrayList.class
			+ " doesn't allow methods which resize the underlying collection");

	private final ArrayList<T> underlying;

	public ConstantSizeArrayList(ArrayList<T> underlying) {
		this.underlying = underlying;
		underlying.trimToSize();
	}

	@Override
	public String toString() {
		return underlying.toString();
	}

	@Override
	public boolean containsAll(Collection<?> c) {
		return underlying.containsAll(c);
	}

	@Override
	public int hashCode() {
		return underlying.hashCode();
	}

	@Override
	public boolean equals(Object o) {
		return underlying.equals(o);
	}

	@Override
	public <T> T[] toArray(T[] a) {
		return underlying.toArray(a);
	}

	@Override
	public Object[] toArray() {
		return underlying.toArray();
	}

	@Override
	public List<T> subList(int fromIndex, int toIndex) {
		return underlying.subList(fromIndex, toIndex);
	}

	@Override
	public int size() {
		return underlying.size();
	}

	@Override
	public T set(int index, T element) {
		return underlying.set(index, element);
	}

	@Override
	public Iterator<T> iterator() {
		return Collections.unmodifiableList(underlying).iterator();
	}

	@Override
	public ListIterator<T> listIterator() {
		return Collections.unmodifiableList(underlying).listIterator();
	}

	@Override
	public ListIterator<T> listIterator(int index) {
		return Collections.unmodifiableList(underlying).listIterator(index);
	}

	@Override
	public int lastIndexOf(Object o) {
		return underlying.lastIndexOf(o);
	}

	@Override
	public boolean isEmpty() {
		return underlying.isEmpty();
	}

	@Override
	public int indexOf(Object o) {
		return underlying.indexOf(o);
	}

	@Override
	public T get(int index) {
		return underlying.get(index);
	}

	@Override
	@SuppressWarnings("element-type-mismatch")
	public boolean contains(Object o) {
		return underlying.contains(o);
	}

	// TODO delegating clone: is that OK?
	@Override
	public Object clone() {
		return underlying.clone();
	}

	@Override
	public void clear() {
		throw ex;
	}

	@Override
	public boolean addAll(int index, Collection<? extends T> c) {
		throw ex;
	}

	@Override
	public boolean addAll(Collection<? extends T> c) {
		throw ex;
	}

	@Override
	public void add(int index, T element) {
		throw ex;
	}

	@Override
	public boolean add(T e) {
		throw ex;
	}

	@Override
	public boolean retainAll(Collection<?> c) {
		throw ex;
	}

	@Override
	public boolean removeAll(Collection<?> c) {
		throw ex;
	}

	@Override
	public boolean remove(Object o) {
		throw ex;
	}

	@Override
	public T remove(int index) {
		throw ex;
	}

}



Best regards,
Ivan G Shevchenko



More information about the core-libs-dev mailing list