WebSocket client API

Pavel Rappo pavel.rappo at oracle.com
Wed Oct 21 11:22:18 UTC 2015


> On 20 Oct 2015, at 14:32, Simone Bordet <simone.bordet at gmail.com> wrote:
> 
> So why choosing CharBuffer ?

Because in general when an API provides a callback method `c`

   <ReturnType> c(<ParameterTye> x)

an application has to implement, it should better be the case that the
<ParameterType> is the most specific type possible (with possibly more methods
and stricter guarantees) and the <ReturnType> is the least specific type
possible (weaker guarantees).

Note: it's obviously the opposite with an API's method `m` the application has
to call:
 
    <ReturnType> m(<ParameterTye> x)
    
<ReturnType> is the most specific possible, the <ParameterTye> is the least
specific possible.

> The only thing you can do with it is to copy, one more time and with
> no need to, the chars it contains before using them.

Not true. One could use it as Appendable or CharSequence. Or, which is an extra
win, encode it into a ByteBuffer (probably with different encoding) and write
the resulting thing to a Channel.

> Providing a CharSequence, instead, leaves the implementation much more
> room and has the potential to avoid unnecessary copies.

"More room"? Maybe. Unnecessary copies -- highly doubt it. What would
an application (an API's user) need to do to write this CharSequence to
a Channel?

    CompletableFuture<?> onText(CharSequence text, boolean isLast) {
        ...
        if (text instanceof CharBuffer) {
            cb = (CharBuffer) text;
        } else {
            cb = CharBuffer.wrap(text);
        }

        encoder.encode(cb, bb, isLast);
        channel.write(bb);
        ...
    }

------------
So the implementation is very honest here. It returns the same object it's just
used for a decoding. Whether a code snippet above worth weakening the type
passed (from CharBuffer to CharSequence) is something to think about.

As for me, I need to think about it.

> The implementation could synthesize the bytes into a String, and pass
> that to the application without further copies (with some JDK help).

Any specific examples?



More information about the net-dev mailing list