2

我正在使用采用 OutputStream 的第三方二进制编码器。我从 Marshallable 的 writeMarshallable 方法中检索 OutputStream,类似于:

public void writeMarshallable(WireOut wire) {
    OutputStream outputStream = wire.bytes().outputStream();
    // third party code gets the outputStream, etc.
}

wire.bytes().outputStream()的实现在每次调用时都会创建一个新的 StreamingOutputStream,这是我希望避免的(当底层 Bytes实际上没有改变时,多余的对象分配)。

也就是说,我正在考虑将 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.
}

所以我的问题是这是否是一种合理的方法,或者你们编年史的人是否有更明智的方法?

谢谢!!

4

1 回答 1

0

我建议使用 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.
}
于 2016-12-22T15:35:48.480 回答