特にトレースがオンになっている場合は、コード全体で頻繁に呼び出される、ログとトレースに関連するコードがあります。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を投入することもできます(現在はそうしています)。これにより、場合によってはサイズが変更されますが、常にそうとは限りません。ただし、ソースコードのマジックナンバーは好きではありません。この機能は、「一度最適化して、すべてのプロジェクトで使用する」場合です。