# Class AbstractCollectionDecorator<E>

java.lang.Object
org.apache.commons.collections4.collection.AbstractCollectionDecorator<E>

Type Parameters:
  `E` - the type of the elements in the collection

All Implemented Interfaces:
  `Serializable`, `Iterable<E>`, `Collection<E>`

Direct Known Subclasses:
  `AbstractBagDecorator`, `AbstractDualBidiMap.View`, `AbstractListDecorator`, `AbstractMultiSetDecorator`, `AbstractQueueDecorator`, `AbstractSetDecorator`, `IndexedCollection`, `PredicatedCollection`, `TransformedCollection`, `UnmodifiableBoundedCollection`, `UnmodifiableCollection`

public abstract class AbstractCollectionDecorator<E> extends Object implements Collection<E>, Serializable
Decorates another `Collection` to provide additional behavior.

Each method call made on this `Collection` is forwarded to the decorated `Collection`. This class is used as a framework on which to build to extensions such as synchronized and unmodifiable behavior. The main advantage of decoration is that one decorator can wrap any implementation of `Collection`, whereas sub-classing requires a new class to be written for each implementation.

This implementation does not perform any special processing with `iterator()`. Instead it simply returns the value from the wrapped collection. This may be undesirable, for example if you are trying to write an unmodifiable implementation it might provide a loophole.

This implementation does not forward the hashCode and equals methods through to the backing object, but relies on Object's implementation. This is necessary to preserve the symmetry of equals. Custom definitions of equality are usually based on an interface, such as Set or List, so that the implementation of equals can cast the object being tested for equality to the custom interface. AbstractCollectionDecorator does not implement such custom interfaces directly; they are implemented only in subclasses. Therefore, forwarding equals would break symmetry, as the forwarding object might consider itself equal to the object being tested, but the reverse could not be true. This behavior is consistent with the JDK's collection wrappers, such as `Collections.unmodifiableCollection(Collection)`. Use an interface-specific subclass of AbstractCollectionDecorator, such as AbstractListDecorator, to preserve equality behavior, or override equals directly.

Since:
  3.0
See Also:
  - Serialized Form

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `AbstractCollectionDecorator()`
  Constructor only used in deserialization, do not use otherwise.
  `protected`
  `AbstractCollectionDecorator(Collection<E> collection)`
  Constructor that wraps (not copies).

- ## Method Summary

  Modifier and Type
  Method
  Description
  `boolean`
  `add(E object)`
  `boolean`
  `addAll(Collection<? extends E> coll)`
  `void`
  `clear()`
  `boolean`
  `contains(Object object)`
  `boolean`
  `containsAll(Collection<?> coll)`
  `protected Collection<E>`
  `decorated()`
  Gets the collection being decorated.
  `boolean`
  `isEmpty()`
  `Iterator<E>`
  `iterator()`
  `boolean`
  `remove(Object object)`
  `boolean`
  `removeAll(Collection<?> coll)`
  `boolean`
  `removeIf(Predicate<? super E> filter)`
  `boolean`
  `retainAll(Collection<?> coll)`
  `protected void`
  `setCollection(Collection<E> collection)`
  Sets the collection being decorated.
  `int`
  `size()`
  `Object[]`
  `toArray()`
  `<T> T[]`
  `toArray(T[] object)`
  `String`
  `toString()`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

  ### Methods inherited from interface java.util.Collection

  `equals, hashCode, parallelStream, spliterator, stream`

  ### Methods inherited from interface java.lang.Iterable

  `forEach`

- ## Constructor Details

  - ### AbstractCollectionDecorator

    protected AbstractCollectionDecorator()
    Constructor only used in deserialization, do not use otherwise.
    Since:
      3.1

  - ### AbstractCollectionDecorator

    protected AbstractCollectionDecorator(Collection<E> collection)
    Constructor that wraps (not copies).
    Parameters:
      `collection` - the collection to decorate, must not be null
    Throws:
      `NullPointerException` - if the collection is null

- ## Method Details

  - ### add

    public boolean add(E object)
    Specified by:
      `add` in interface `Collection<E>`

  - ### addAll

    public boolean addAll(Collection<? extends E> coll)
    Specified by:
      `addAll` in interface `Collection<E>`

  - ### clear

    public void clear()
    Specified by:
      `clear` in interface `Collection<E>`

  - ### contains

    public boolean contains(Object object)
    Specified by:
      `contains` in interface `Collection<E>`

  - ### containsAll

    public boolean containsAll(Collection<?> coll)
    Specified by:
      `containsAll` in interface `Collection<E>`

  - ### decorated

    protected Collection<E> decorated()
    Gets the collection being decorated. All access to the decorated collection goes via this method.
    Returns:
      the decorated collection

  - ### isEmpty

    public boolean isEmpty()
    Specified by:
      `isEmpty` in interface `Collection<E>`

  - ### iterator

    public Iterator<E> iterator()
    Specified by:
      `iterator` in interface `Collection<E>`
    Specified by:
      `iterator` in interface `Iterable<E>`

  - ### remove

    public boolean remove(Object object)
    Specified by:
      `remove` in interface `Collection<E>`

  - ### removeAll

    public boolean removeAll(Collection<?> coll)
    Specified by:
      `removeAll` in interface `Collection<E>`

  - ### removeIf

    public boolean removeIf(Predicate<? super E> filter)
    Specified by:
      `removeIf` in interface `Collection<E>`
    Since:
      4.4

  - ### retainAll

    public boolean retainAll(Collection<?> coll)
    Specified by:
      `retainAll` in interface `Collection<E>`

  - ### setCollection

    protected void setCollection(Collection<E> collection)
    Sets the collection being decorated.

    NOTE: this method should only be used during deserialization

    Parameters:
      `collection` - the decorated collection

  - ### size

    public int size()
    Specified by:
      `size` in interface `Collection<E>`

  - ### toArray

    public Object[] toArray()
    Specified by:
      `toArray` in interface `Collection<E>`

  - ### toArray

    public <T> T[] toArray(T[] object)
    Specified by:
      `toArray` in interface `Collection<E>`

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`