我有一段与日志和跟踪相关的代码,经常在整个代码中调用,特别是在追踪打开时。使用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的临时容量值,这会导致某些情况下需要调整大小,但不总是。然而,我不喜欢源代码中出现神奇数字,而且这个特性是“优化一次,在每个项目中使用”的情况。