在 Java 中,StringJoiner
类没有直接提供 clear()
方法来清空已添加的元素。不过,你可以通过以下几种方式实现类似的 “清空” 效果:
方法 1:创建新的 StringJoiner 实例
最直接的方式是丢弃当前实例,创建一个新的 StringJoiner
:
StringJoiner joiner = new StringJoiner(", ");
joiner.add("a").add("b").add("c"); // 当前结果:"a, b, c"
// 清空:创建新实例
joiner = new StringJoiner(", ");
方法 2:重置 value 属性(反射方式)
通过反射直接修改 StringJoiner
的内部 value
属性(不推荐生产环境使用):
import java.lang.reflect.Field;
public static void clearStringJoiner(StringJoiner joiner) throws NoSuchFieldException, IllegalAccessException {
Field valueField = StringJoiner.class.getDeclaredField("value");
valueField.setAccessible(true);
valueField.set(joiner, null);
}
// 使用示例
StringJoiner joiner = new StringJoiner(", ");
joiner.add("a").add("b");
clearStringJoiner(joiner); // 清空
方法 3:自定义可重置的 StringJoiner 包装类
封装 StringJoiner
并添加重置方法:
public class ResettableStringJoiner {
private StringJoiner joiner;
private final String delimiter;
private final String prefix;
private final String suffix;
public ResettableStringJoiner(CharSequence delimiter) {
this(delimiter, "", "");
}
public ResettableStringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
this.delimiter = delimiter.toString();
this.prefix = prefix.toString();
this.suffix = suffix.toString();
this.joiner = new StringJoiner(delimiter, prefix, suffix);
}
public ResettableStringJoiner add(CharSequence newElement) {
joiner.add(newElement);
return this;
}
public void reset() {
joiner = new StringJoiner(delimiter, prefix, suffix);
}
@Override
public String toString() {
return joiner.toString();
}
}
// 使用示例
ResettableStringJoiner rjoiner = new ResettableStringJoiner(", ");
rjoiner.add("a").add("b"); // "a, b"
rjoiner.reset(); // 清空
推荐方案
方法 1 是最简单、最安全的方式,适用于大多数场景。
如果需要频繁重置,方法 3 的自定义包装类能提供更好的封装性。
反射方式(方法 2)仅建议在测试或非关键代码中使用。