Actually every occurrence of String as a parameter could be
changed to CharSequence allowing the user to pass String,
StringBuffer, and StringBuilder or even CharBuffer.
The downside is that (a) you can't assume that the supplied value is
immutable; if you need to retain it beyond the call you have to make a copy;
(b) there can be a lot of "instance of" testing to see what kind of
CharSequence you've been given, and (c) you can't compare different kinds of
CharSequence for equality.
Saxon uses CharSequence very extensively despite these drawbacks, but it's
not necessarily the right approach everywhere.