我有一段记录和跟踪相关的代码,它经常在整个代码中调用,尤其是在打开跟踪时。StringBuilder 用于构建字符串。字符串具有合理的最大长度,我想大约是数百个字符。
问题:是否有现有的图书馆可以做这样的事情:
// in reality, StringBuilder is final,
// would have to create delegated version instead,
// which is quite a big class because of all the append() overloads
public class SmarterBuilder extends StringBuilder {
private final AtomicInteger capRef;
SmarterBuilder(AtomicInteger capRef) {
int len = capRef.get();
// optionally save memory with expense of worst-case resizes:
// len = len * 3 / 4;
super(len);
this.capRef = capRef;
}
public syncCap() {
// call when string is fully built
int cap;
do {
cap = capRef.get();
if (cap >= length()) break;
} while (!capRef.compareAndSet(cap, length());
}
}
为了利用这一点,我的日志相关类将有一个capRef
具有合适范围的共享变量。
(奖励问题:我很好奇,是否可以在不循环的情况下执行 syncCap() ?)
动机:我知道 StringBuilder 的默认长度总是太少。我可以(并且目前确实)输入 100 的临时初始容量值,这会导致在某些情况下调整大小,但并非总是如此。但是,我不喜欢源代码中的幻数,而这个特性是“优化一次,在每个项目中使用”的情况。