org.apache.commons.collections4.list
Class GrowthList<E>

java.lang.Object
  extended by org.apache.commons.collections4.collection.AbstractCollectionDecorator<E>
      extended by org.apache.commons.collections4.list.AbstractListDecorator<E>
          extended by org.apache.commons.collections4.list.AbstractSerializableListDecorator<E>
              extended by org.apache.commons.collections4.list.GrowthList<E>
All Implemented Interfaces:
Serializable, Iterable<E>, Collection<E>, List<E>

public class GrowthList<E>
extends AbstractSerializableListDecorator<E>

Decorates another List to make it seamlessly grow when indices larger than the list size are used on add and set, avoiding most IndexOutOfBoundsExceptions.

This class avoids errors by growing when a set or add method would normally throw an IndexOutOfBoundsException. Note that IndexOutOfBoundsException IS returned for invalid negative indices.

Trying to set or add to an index larger than the size will cause the list to grow (using null elements). Clearly, care must be taken not to use excessively large indices, as the internal list will grow to match.

Trying to use any method other than add or set with an invalid index will call the underlying list and probably result in an IndexOutOfBoundsException.

Take care when using this list with null values, as null is the value added when growing the list.

All sub-lists will access the underlying list directly, and will throw IndexOutOfBoundsExceptions.

This class differs from LazyList because here growth occurs on set and add, where LazyList grows on get. However, they can be used together by decorating twice.

Since:
3.2
Version:
$Id: GrowthList.java 1479405 2013-05-05 21:58:52Z tn $
See Also:
LazyList, Serialized Form

Constructor Summary
  GrowthList()
          Constructor that uses an ArrayList internally.
  GrowthList(int initialSize)
          Constructor that uses an ArrayList internally.
protected GrowthList(List<E> list)
          Constructor that wraps (not copies).
 
Method Summary
 void add(int index, E element)
          Decorate the add method to perform the growth behaviour.
 boolean addAll(int index, Collection<? extends E> coll)
          Decorate the addAll method to perform the growth behaviour.
static
<E> GrowthList<E>
growthList(List<E> list)
          Factory method to create a growth list.
 E set(int index, E element)
          Decorate the set method to perform the growth behaviour.
 
Methods inherited from class org.apache.commons.collections4.list.AbstractListDecorator
decorated, get, indexOf, lastIndexOf, listIterator, listIterator, remove, subList
 
Methods inherited from class org.apache.commons.collections4.collection.AbstractCollectionDecorator
add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, setCollection, size, toArray, toArray, toString
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface java.util.List
add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray
 

Constructor Detail

GrowthList

public GrowthList()
Constructor that uses an ArrayList internally.


GrowthList

public GrowthList(int initialSize)
Constructor that uses an ArrayList internally.

Parameters:
initialSize - the initial size of the ArrayList
Throws:
IllegalArgumentException - if initial size is invalid

GrowthList

protected GrowthList(List<E> list)
Constructor that wraps (not copies).

Parameters:
list - the list to decorate, must not be null
Throws:
IllegalArgumentException - if list is null
Method Detail

growthList

public static <E> GrowthList<E> growthList(List<E> list)
Factory method to create a growth list.

Type Parameters:
E - the type of the elements in the list
Parameters:
list - the list to decorate, must not be null
Returns:
a new growth list
Throws:
IllegalArgumentException - if list is null
Since:
4.0

add

public void add(int index,
                E element)
Decorate the add method to perform the growth behaviour.

If the requested index is greater than the current size, the list will grow to the new size. Indices between the old size and the requested size will be filled with null.

If the index is less than the current size, the value will be added to the underlying list directly. If the index is less than zero, the underlying list is called, which will probably throw an IndexOutOfBoundsException.

Specified by:
add in interface List<E>
Overrides:
add in class AbstractListDecorator<E>
Parameters:
index - the index to add at
element - the object to add at the specified index
Throws:
UnsupportedOperationException - if the underlying list doesn't implement set
ClassCastException - if the underlying list rejects the element
IllegalArgumentException - if the underlying list rejects the element

addAll

public boolean addAll(int index,
                      Collection<? extends E> coll)
Decorate the addAll method to perform the growth behaviour.

If the requested index is greater than the current size, the list will grow to the new size. Indices between the old size and the requested size will be filled with null.

If the index is less than the current size, the values will be added to the underlying list directly. If the index is less than zero, the underlying list is called, which will probably throw an IndexOutOfBoundsException.

Specified by:
addAll in interface List<E>
Overrides:
addAll in class AbstractListDecorator<E>
Parameters:
index - the index to add at
coll - the collection to add at the specified index
Returns:
true if the list changed
Throws:
UnsupportedOperationException - if the underlying list doesn't implement set
ClassCastException - if the underlying list rejects the element
IllegalArgumentException - if the underlying list rejects the element

set

public E set(int index,
             E element)
Decorate the set method to perform the growth behaviour.

If the requested index is greater than the current size, the list will grow to the new size. Indices between the old size and the requested size will be filled with null.

If the index is less than the current size, the value will be set onto the underlying list directly. If the index is less than zero, the underlying list is called, which will probably throw an IndexOutOfBoundsException.

Specified by:
set in interface List<E>
Overrides:
set in class AbstractListDecorator<E>
Parameters:
index - the index to set
element - the object to set at the specified index
Returns:
the object previously at that index
Throws:
UnsupportedOperationException - if the underlying list doesn't implement set
ClassCastException - if the underlying list rejects the element
IllegalArgumentException - if the underlying list rejects the element


Copyright © 2001–2013 The Apache Software Foundation. All rights reserved.