Choosing between CharSequence and String for an API

charsequence, java, string

Solution

Quoting `CharSequence` Javadoc:

This interface does not refine the general contracts of the `equals` and `hashCode` methods. The result of testing two objects that implement `CharSequence` for equality is therefore, in general, undefined. Each object may be implemented by a different class, and there is no guarantee that each class will be capable of testing its instances for equality with those of the other. It is therefore inappropriate to use arbitrary `CharSequence` instances as elements in a set or as keys in a map.

Hence IMO We must think twice before using CharSequnce as a replacement for String.

Problem

A `String` is-a `CharSequence`. Many methods in the Java library accept `CharSequence` so they operate more generally. Some classe have a `String` method (for example, `Writer.write(String)`) and also implement `Appendable` with an equivalent `CharSequence` method (for example, `Writer.append(CharSequence)`). If I am writing a class that delegates to such a class, ands needs some text input, I can choose for that input to be a `String` or a `CharSequence`. Choosing the later makes the class more flexible, by giving the client more options. But I don't see much code that does so: text arguments are almost invariably a `String` rather than a `CharSequence`. Is there a down-side to using `CharSequence`? Is there a performance hit? Or is it just programmer intertia or ignorance that causes use of `String` rather than `CharSequence`? Compare ``` class XMLWriter { private final Writer writer; // more stuff here public void writeComment(String text) { writer.write("<!-- "); writer.write(text); writer.write(" -->"); } } ``` with ``` class XMLWriter { private final Writer writer; // more stuff here public void writeComment(CharSequence text) { writer.write("<!-- "); writer.append(text); writer.write(" -->"); } } ```

Original source

Related problems