[concurrency-interest] Handling Null Values in ConcurrentHashMap

Bob Lee crazybob at crazybob.org
Fri May 12 15:52:27 EDT 2006


Hey! I didn't recommend that. ;)

In the blog I linked to, I said:

"Things can still get a little hairy when you mix null placeholders
with generic types. Your placeholder can implement the same type as
the value, or you can resort to casting hacks."

OK, I said, "you can," but I wouldn't do it myself.

The nice thing about the enum null placeholder is that it's so short
and sweet you don't have to refactor it out into a common place and
risk infecting others with bad ideas. ;)

Bob

On 5/12/06, Joshua Bloch <josh at bloch.us> wrote:
> Tim and Bob,
>
> These are interesting/cool patterns, but they're a bit scary, as they
> cast something that isn't a T to (T).  You have to be very careful
> what you do with the the pseudo-null.  I can see using this inside a
> library, but I would think more than twice before putting it in the
> JDK.
>
>        Josh
>
> On 5/12/06, Tim Peierls <tim at peierls.net> wrote:
> > So how about something like this?
> >
> >
> > public enum Null {
> >     VALUE;
> >     public static T value() { return (T) VALUE; }
> >     public static boolean isNull(T value) { return value == VALUE; }
> > }
> >
> > Use Null.<Foo>value() in Set<Foo>, but don't forget to check
> > Null.isNull(foo).
> >
> > --tim
> >
> >
> > --tim
> >
> >
> > On 5/12/06, Bob Lee <crazybob at crazybob.org> wrote:
> > > The nice part about using an enum is that everything works even after
> > > you serialize and deserialize your object.
> > >
> > > Bob
> > >
> > > On 5/12/06, Tim Peierls <tim at peierls.net> wrote:
> > > > On 5/12/06, Bob Lee <crazybob at crazybob.org> wrote:
> > > >
> > > > > On 5/12/06, Doug Lea <dl at cs.oswego.edu> wrote:
> > > > > > Would it be easier to declare somewhere
> > > > > >    static final Object NULL = new Object();
> > > > > > and replace all use of nulls in uses of maps with NULL?
> > > > >
> > > > > Enums also work great here:
> > > > >
> > > >
> > http://crazybob.org/2005/12/null-placeholders-in-jdk-15.html
> > > >
> > > >
> > > > And for getting around in a generics-enabled world:
> > > >
> > > > public class Null<T> {
> > > >     private static final Object NULL = new Object();
> > > >     public static T null() { return (T) NULL; }
> > > >     public static boolean isNull(T x) { return x == NULL; }
> > > >     private Null() {}
> > > > }
> > > >
> > > > Get a null value for type Foo with Null.<Foo>null(). Test it with
> > > > Null.isNull(foo) or get CCEs in the same way that you would get NPE if
> > you
> > > > were using primitive null.
> > > >
> > > > --tim
> > >
> >
> >
> > _______________________________________________
> > Concurrency-interest mailing list
> > Concurrency-interest at altair.cs.oswego.edu
> > http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest
> >
> >
> >
>



More information about the Concurrency-interest mailing list