We are now ready to define a simple program to sum the integers in a lists. We will add a definition of the method

to each class in our composite class hierarchy forint sum();

// IntList := Empty() + Cons(Object, IntList) abstract class IntList { ... abstract int sum(); // returns the sum of the numbers in this }

Next we need to generate examples showing the expected behavior of the method:

// IntList := Empty() + Cons(Object, IntList) abstract class IntList { ... abstract int sum(); // returns the sum of the numbers in this void test(int ans) { // assumes that ans is the correct answer for this.sum() // prints this and the this.sum(); // reports failure if result does not match ans int result = sum(); System.out.println("computed sum of " + this + " = " + sum()); if (result != ans) System.out.println("FAILURE: correct answer is " + ans); } public static void main(String[] args) { // test method Empty.only.test(0); Cons.oneElt.test(1); Cons.twoElts.test(6); Cons.threeElts.test(-4); } }

As the fourth step, we select a template for writing the `sum` method:

class Empty { ... int sum() { ... } } class Cons extends IntList { int first; IntList rest; ... int sum() { ... first ... rest ... rest.sum() ... ; } }

Finally, we complete the coding process by filling in the bodies of the methods in the template:

class Empty { ... int sum() { return 0; } } class Cons extends IntList { int first; IntList rest; ... int sum() { return first + rest.sum(); } }

To finish the design recipe, we test our code using the examples
in the `main` method of `IntList`.

**Finger exercise:** Load the `IntList2` sample program into the
DrJava *Definitions* window. In the *Interactions* window,
run the tests specified in `IntList.main`. Using the design
recipe, add a definition of a method `prod` to compute the product
of a list of numbers and test it. Note that the **Data Analysis
and Design** step has aleady been done in `IntList` code.