The Appendable interface

To illustrate Java interfaces, we'll look at an example from the JDK. Let's suppose we write a method to append some data to a StringBuffer:

public void appendData(StringBuffer sb) {
  sb.append(...);
}

Now, this is great if we have a StringBuffer to pass in. But supposing we want a version to output the data to a Writer instead of a StringBuffer. Of course, if Writer were a subclass of StringBuffer, the above method would just work. But sadly, it isn't. So we could just write another version:

public void appendData(Writer wr) {
  wr.write(...);
}

We'd have the same problem if we wanted to write the data to an OutputStream, StringBuilder, or various other plausible objects that we might want to append the data to. If this were part of some library that we wanted to make as flexible as possible, we could end up with goodness knows how many versions of the method, each taking a different type of object and calling a different method as appropriate to that object1.

As we'll see on the next page, this is where the Appendable interface steps in.


1. You may be reminded of the two versions of Throwable.printStackTrace(), which of course date back to the days before Appendable.


Written by Neil Coffey. Copyright © Javamex UK 2008. All rights reserved.