Повторное использование выходного потока 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.
}
Другие вопросы по тегам