java.util.Optional: a better implementation?

Doug Simon doug.simon at oracle.com
Wed Oct 29 12:24:58 UTC 2014


Hi Nicolas,

Your proposal would replace a null check with a type test or (worse) a virtual dispatch. If you do the performance experiment, I’d be very surprised if the current implementation is not the fastest.

-Doug

> On Oct 29, 2014, at 1:06 PM, nicarran at gmail.com wrote:
> 
> Hi,
> 
> I'm evaluating java.util.Optional to use it all around my code. I
> noticed that its current implementation checks for null on almost every
> method and that these checks can be avoided by changing its
> implementation to an abstract Optional class with two subclasses, one
> for the EMPTY and another for the not-empty (present) values without
> breaking compatibility. Something like this:
> 
> **********************
> 
> public abstract class Optional<T> {
> 
>    private static final Optional<?> EMPTY=new Empty<>();
> 
>    private static class Empty<T>
>        extends Optional<T> {
> 
>        @Override
>        public boolean isPresent() {
>            return false;
>        }
>        @Override
>        public T get() {
>            throw new NoSuchElementException("No value present");
>        }
>        @Override
>        public void ifPresent(Consumer<? super T> consumer) {
>        }
>        // and so on
>    }
> 
>    private static class Present<T>
>        extends Optional<T> {
> 
>        private final T value;
> 
>        Present(T value) {
>            this.value=Objects.requireNonNull(value);
>        }
> 
>        @Override
>        public boolean isPresent() {
>            return true;
>        }
>        @Override
>        public T get() {
>            return value;
>        }
>        @Override
>        public void ifPresent(Consumer<? super T> consumer) {
>            consumer.accept(value);
>        }
>        // and so on
>    }
> 
>    private Optional() {}
> 
>    public static <T> Optional<T> of(T value) {
>        return new Present<>(value);
>    }
> 
>    public static <T> Optional<T> ofNullable(T value) {
>        return value==null? empty(): new Present<>(value);
>    }
> 
>    @SuppressWarnings("unchecked")
>    public static <T> Optional<T> empty(){
>        return (Optional<T>)EMPTY;
>    }
> 
>    public abstract boolean isPresent();
> 
>    public abstract T get();
> 
>    public abstract void ifPresent(Consumer<? super T> consumer);
> 
>    // and so on
> }
> ********************
> 
> The JVM probably optimizes and throws away the null checks yielding in
> equal performance compared to the proposed implementation (above) ---I
> haven't done any performance tests----, but why wait for the JVM when
> this implementation is also nicer to read? What do you think?
> 
> Please let me know if this is not the appropriate mailing list to post
> this message,
> Thanks,
> Nicolas




More information about the discuss mailing list