/** * Concrete implementation of the non-empty list interface, INEList. * Contains two pieces of data: * first: an Object representing the first data element * rest: an IList object representing the rest of this non-emptylist. * When a class contains other objects that are isomorphic to itself, * this class is called a composite. * Provides concrete code for * a constructor to initialize this NEList to a given first and rest, * the getFirst() method for accessing the first data element, * the getRest() method for accesssing the rest of the list. * It has concrete implementations of all the methods inherited from IList. * @author Dung X. Nguyen * @since Copyright 2003 by DXN - All rights reserved */ public class NEList implements INEList { /** * The first data element of this NEList. */ private Object _first; /** * The rest or "tail" of this NEList. * Data Invariant: _rest != null; */ private IList _rest; /** * Initializes this NEList to a given first and rest. * @param first the first data element of this NEList. * @param tail != null, the rest of this NEList. */ public NEList(Object first, IList tail) { _first = first; _rest = tail; } /** * Returns the first data element of this NEList. */ public Object getFirst() { return _first; } /** * Returns the rest of this NEList. */ public IList getRest() { return _rest; } /** * Recursively computes the length of _rest and adds 1 to the result. * @return an int >= 1. */ public int getLength() { return 1 + _rest.getLength(); } /** * Concatenates _rest with the given IList and "cons" _first to the result. * @param rhs the IList on the right hand side. * @return an INEList. */ public IList concatenate(IList rhs) { return new NEList(_first, _rest.concatenate(rhs)); } /** * Returns a parenthesized list of elements in this NEList. * Calls a helper method to ensure that there is no extra space before the * closing right parenthesis. */ public String toString() { return "(" + _first + _rest.toStringHelp() + ")"; } /** * This NEList is the rest of some other INEList. * Returns a space, followed by the toString() of _first, then followed * by the recursive toStringHelp() of _rest. * NOTE: The presence of the space String, " ", in the return expression * causes the compiler to call on _first.toString(), even though we only * write down _first. */ public String toStringHelp() { return " " + _first + _rest.toStringHelp(); } }