001 package listFW.factory;
002
003 import listFW.*;
004 import listFW.visitor.*;
005
006 /**
007 * Manufactures concrete IMTList<E> and INEList<E> objects.
008 * The INEList object is implemented as a private anonymous inner object.
009 * The implementations for MTList and NEList are
010 * completely invisible to the outside of this factory.
011 * @author Dung X. Nguyen and Stephen Wong
012 * @since Copyright 2004 by SBW & DXN - All rights reserved
013 * @author Mathias Ricken - Copyright 2008 - All rights reserved.
014 */
015 public class CompositeListFactory<E> implements IListFactory<E> {
016
017 /**
018 * Note: A parametrized IMTList(E> cannot be static.
019 */
020 private final IMTList<E> mtList = new IMTList<E>() {
021 final public <R,P> R execute(IListAlgo<? super E , R, P> algo, P ... inp) {
022 return algo.emptyCase(this, inp);
023 }
024
025 public String toString() {
026 return toStringAlgo.emptyCase(this);
027 }
028 };
029
030 private static final IListAlgo<Object, String, ?> toStringAlgo = ToStringAlgo.Singleton;
031
032 /**
033 * Creates an empty list.
034 * @return an IMTList object.
035 */
036 public IMTList<E> makeEmptyList() {
037 return mtList;
038 }
039
040 /**
041 * Creates a non-empty list containing a given first and a given rest.
042 * @param first a data object.
043 * @param rest != null, the rest of the non-empty list to be manufactured.
044 * @return an INEList object containing first and rest
045 */
046 public INEList<E> makeNEList(final E first, final IList<? extends E> rest) {
047 return new INEList<E>(){
048 final public E getFirst() {
049 return first;
050 }
051
052 final public IList<? extends E> getRest() {
053 return rest;
054 }
055
056 final public <R,P> R execute(IListAlgo<? super E, R , P> algo, P ... inp) {
057 return algo.nonEmptyCase(this, inp);
058 }
059
060 public String toString() {
061 return toStringAlgo.nonEmptyCase(this);
062 }
063 };
064 }
065 }