Hi Ismael,

Got it. I agree that it is safer to use java.lang.Long instead of primitive
long. Returning a null sounds reasonable in our case where performance is
not a major concern. I will make the change in the KIP wiki.

Regarding the consistency, I am not sure how big impact it would be if we
get rid all the primitive type fields in the messages (which is a backwards
incompatible change). If it is a problem, we may still have the
inconsistent representation of the missing values.

Jiangjie (Becket) Qin

On Sat, Sep 10, 2016 at 1:01 AM, Ismael Juma <ism...@juma.me.uk> wrote:

> Becket, comments inline.
>
> On Fri, Sep 9, 2016 at 6:55 PM, Becket Qin <becket....@gmail.com> wrote:
>
> > Completely agree that we should have a consistent representation of
> > something missing/unknown in the code.
> >
> > My understanding of the convention is that -1 means "not
> > available"/"unknown". For example, when producer request failed, the
> offset
> > we used in the callback is -1. And Message.NoTimestamp is also -1.
>
>
> ProducerRecord uses a nullable timestamp instead of Record.NO_TIMESTAMP to
> indicate a missing value though. That was the example in my original
> message.
>
> Using -1
> > instead of null has at least two benefits.
> > 1) it works for primitive type as well as classes.
> >
>
> This isn't a benefit outside of very specific use-cases (were the cost of
> boxing is a problem). The wrapper classes can be used, after all. The
> downsides of using -1 is that the type system doesn't help you (there's a
> reason why they're called magic values). If you see a `java.lang.Long`, you
> have a hint that `null` is a valid value. The other problem with a -1 for a
> timestamp is that you may do nonsensical comparisons against it without
> error. When using `null`, it will fail-fast with a NPE so that you can fix
> it (even better would be to get compile-time errors, but let's leave that
> out of this discussion for now).
>
>
> > 2) it is easy to send via wire protocols
> >
>
> I think it's important to distinguish what we do in the wire protocols
> (which may be more low-level) with what we do in user facing APIs (where
> usability and safety are very important).
>
> Ismael
>

Reply via email to