¥abstract
class List {
¥ abstract Object getFirst();
¥ abstract List getRest();
¥ abstract String toStringHelp();
¥}
¥class
Empty extends List {
¥ static Empty ONLY = new Empty(); //
singleton pattern
¥ private Empty() {}
¥ Object getFirst() { throw new
IllegalArgumentException(
¥ "first requires a non Empty
List");
¥ }
¥ List getRest() { throw new
IllegalArgumentException(
¥ "rest requires a non Empty
List");
¥ }
¥ public String toString() { return
"()"; }
¥ String toStringHelp() { return
""; }
¥}
¥class
Cons extends List {
¥ Object first;
¥ List rest;
¥ Cons(Object f, List r) {
¥ first = f;
¥ rest = r;
¥ }
¥ Object getFirst() { return first;
}
¥ List getRest() { return rest; }
¥ public String toString() { return
"(" + first + rest.toStringHelp() + ")"; }
¥ String toStringHelp() { return "
" + first + rest.toStringHelp(); }
¥}
¥