Повторное использование выходного потока Chronicle Bytes
Я использую сторонний двоичный кодер, который принимает OutputStream. Я извлекаю OutputStream из метода writeMarshallable маршалла, похожего на этот:
public void writeMarshallable(WireOut wire) {
OutputStream outputStream = wire.bytes().outputStream();
// third party code gets the outputStream, etc.
}
Реализация wire.bytes().outputStream() создает новый StreamingOutputStream при каждом вызове, чего я и надеюсь избежать (избыточное распределение объектов, когда базовые байты фактически не изменились).
Тем не менее, я думаю о сохранении WeakReference для данного значения wire.bytes () и проверке, совпадает ли предоставленная ссылка на значение (т. Е. ==) с ранее предоставленным значением:
private WeakReference<Bytes<?>> priorBytesRef = new WeakReference<>(null);
public void writeMarshallable(WireOut wire) {
Bytes<?> bytes = wire.bytes();
if (bytes != priorBytesRef.get()) {
priorBytesRef = new WeakReference<>(bytes);
thirdPartyEncoder = EncoderFactoryExample.from(bytes.outputStream());
}
// utilize thirdPartyEncoder, etc.
}
Таким образом, мой вопрос заключается в том, является ли это разумным подходом или у вас, Хроники, есть более рекомендуемый способ?
Спасибо!!
1 ответ
Я предлагаю использовать ThreadLocal для сохранения StreamingOutputStream
,
static final ThreadLocal<StreamingOutputStream> bosTL = ThreadLocal.withInitial(StreamingOutputStream::new);
public void writeMarshallable(WireOut wire) {
OutputStream out = bosTL.get().init(wire.bytes());
// utilize thirdPartyEncoder, etc.
}