private final String prefix; //前缀
private final String delimiter; //分隔符(可以是字符串)
private final String suffix; //后缀
private StringBuilder value;
//当value为空时的返回值
private String emptyValue;
//将前缀和后缀设为空
public StringJoiner(CharSequence delimiter) {
this(delimiter, "", "");
}
public StringJoiner(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
Objects.requireNonNull(prefix, "The prefix must not be null");
Objects.requireNonNull(delimiter, "The delimiter must not be null");
Objects.requireNonNull(suffix, "The suffix must not be null");
// 进行保护性拷贝,防止分隔符、前缀和后缀在使用过程中在其他代码中被修改
this.prefix = prefix.toString();
this.delimiter = delimiter.toString();
this.suffix = suffix.toString();
//初始化空值——前缀+后缀
this.emptyValue = this.prefix + this.suffix;
}
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
private StringBuilder prepareBuilder() {
if (value != null) {
//已经有元素的情况下,先添加分隔符
value.append(delimiter);
} else {
//在没有元素的情况下,新建一个StringBuilder对象,并添加前缀
value = new StringBuilder().append(prefix);
}
return value;
}
@Override
public String toString() {
if (value == null) {
//如果value为空,则返回emptyValue
return emptyValue;
} else {
//
if (suffix.equals("")) {
return value.toString();
} else {
int initialLength = value.length();
String result = value.append(suffix).toString();
// reset value to pre-append initialLength
value.setLength(initialLength);
return result;
}
}
}
public StringJoiner merge(StringJoiner other) {
Objects.requireNonNull(other);
if (other.value != null) {
final int length = other.value.length();
StringBuilder builder = prepareBuilder();
builder.append(other.value, other.prefix.length(), length);
}
return this;
}
这种设计的原因可能基于以下的情况(将append()方法里的length替换为other.value.length()):
public StringJoiner merge(StringJoiner other) {
Objects.requireNonNull(other);
if (other.value != null) {
StringBuilder builder = prepareBuilder();
builder.append(other.value, other.prefix.length(), other.value.length());
}
return this;
}
如果依照以上的代码执行自我合并,当执行了prepareBuilder()方法后,value中将增加一个分隔符,由于要合并的对象和被合并的对象是同一个对象,若使用以上的方法进行合并,合并完成后,value的末尾将多出一个分隔符,若之后再使用该对象的add()方法,将出现问题。
public StringJoiner setEmptyValue(CharSequence emptyValue) {
this.emptyValue = Objects.requireNonNull(emptyValue,
"The empty value must not be null").toString();
return this;
}
public int length() {
return (value != null ? value.length() + suffix.length() :
emptyValue.length());
}
https://www.jianshu.com/p/469fe8fdd3be