package plume; import java.util.*; import java.io.*; // NEEDS DOCUMENTATION! // (Probably mostly Javadoc "see" directives, possibly with first line of relevant method doc.) /** * Like StringBuilder, but adds a delimiter between each pair of strings * that are inserted into the Stringbuilder. This can simplify the logic of * programs and also avoid errors. <p> * * Does not extend StringBuilder because that would probably break, due to * the possibility of calling the wrong version of append. Also, I don't * (yet) want to override all the methods; this simpler version seems * sufficient for the time being. **/ public class StringBuilderDelimited implements Appendable, CharSequence { private StringBuilder delegate = new StringBuilder(); private boolean empty = true; private final String delimiter; public StringBuilderDelimited(String delimiter) { this.delimiter = delimiter; } private void appendDelimiter() { if (empty) { empty = false; } else { delegate.append(delimiter); } } public StringBuilderDelimited append(/*@Nullable*/ String str) { appendDelimiter(); delegate.append(str); return this; } public StringBuilderDelimited append(/*@Nullable*/ Object o) { appendDelimiter(); delegate.append(o); return this; } public StringBuilderDelimited append(char c) { appendDelimiter(); delegate.append(c); return this; } public StringBuilderDelimited append(/*@Nullable*/ CharSequence csq) { appendDelimiter(); delegate.append(csq); return this; } public StringBuilderDelimited append(/*@Nullable*/ CharSequence csq, int start, int end) { appendDelimiter(); delegate.append(csq, start, end); return this; } public char charAt(int index) { return delegate.charAt(index); } public int length() { return delegate.length(); } public CharSequence subSequence(int start, int end) { return delegate.subSequence(start, end); } public String toString() { return delegate.toString(); } }