/** * Represents an abstract Scheme-like list, an immutable linear recursive * structure of data. Has abstract methods to provide its internal data and * structure to the client. Since an AList has an internal structure that is * isomorphic to itself, it's best to implement it using the composite pattern. */ public abstract class AList { /** * Computes and returns the number of elements in this AList. * @return int >= 0. */ public abstract int getLength(); /** * Computes and returns the minimum of this AList, assuming it contains * Integer objects. * @return behavior relegated to concrete subclasses. */ public abstract int getMinimum(); // Other methods elided... }
public
class EmptyList extends
AList { public final static EmptyList Singleton = new EmptyList(); private EmptyList() { } |
public class
NEList extends AList { private Object _first; private AList _rest; |
/** * Computes the length of this EmptyList. * @return 0 */ public int getLength() { return 0; } |
/** * Returns 1 + the number of elements in the rest of this NEList. * @return int > 0. */ public int getLength() { return 1 + _rest.getLength(); } |
/** * The minimum of the Empty list can be thought of as +infinity. * @return Integet.MAX_VALUE representing +infinity. */ public int getMinimum() { return Integer.MAX_VALUE; } } |
/** * Returns the minimum of the first and the minimum of the rest. * @return an int. */ public int getMinimum() { return Math.min(((Integer)_first).intValue(), _rest.getMinimum()); } } |