JDK 8 code review request for 8011800: Add java.util.Objects.requireNonNull(T, Supplier<String>)

Mike Duigou Mike.Duigou at oracle.COM
Wed Apr 10 01:00:49 UTC 2013


Are we convinced that the capture cost of the lambdas likely to be used as suppliers is generally (*) better than the string construction that using a Supplier would avoid?

(*) I say "generally" because I am certain examples could be found in which either is clearly better. 

Mike

On Apr 9 2013, at 14:12 , Joe Darcy wrote:

> Hello,
> 
> Please review my changes for
> 
>    8011800: Add java.util.Objects.requireNonNull(T, Supplier<String>)
>    http://cr.openjdk.java.net/~darcy/8011800.0/
> 
> which add a new method to java.util.Objects to take a Supplier<String> rather than a String.
> 
> Patch inline below.
> 
> Thanks,
> 
> -Joe
> 
> --- old/src/share/classes/java/util/Objects.java    2013-04-09 14:08:34.000000000 -0700
> +++ new/src/share/classes/java/util/Objects.java    2013-04-09 14:08:33.000000000 -0700
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
>  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>  *
>  * This code is free software; you can redistribute it and/or modify it
> @@ -25,6 +25,8 @@
> 
> package java.util;
> 
> +import java.util.function.Supplier;
> +
> /**
>  * This class consists of {@code static} utility methods for operating
>  * on objects.  These utilities include {@code null}-safe or {@code
> @@ -226,4 +228,31 @@
>             throw new NullPointerException(message);
>         return obj;
>     }
> +
> +    /**
> +     * Checks that the specified object reference is not {@code null} and
> +     * throws a customized {@link NullPointerException} if it is.
> +     *
> +     * <p>Compared to the sibling method {@link requireNonNull(Object,
> +     * String}, this methods allows creation of the message to be
> +     * deferred until after the null check is made. Note that if the
> +     * supplier is provided via a lambda expression, there can be an
> +     * overhead involved in creating the supplier. Therefore, while
> +     * this method may confer a net performance advantage in the
> +     * non-null case, it is most likely to do so if creating the
> +     * message string is expensive.
> +     *
> +     * @param obj     the object reference to check for nullity
> +     * @param messageSupplier supplier of the detail message to be
> +     * used in the event that a {@code NullPointerException} is thrown
> +     * @param <T> the type of the reference
> +     * @return {@code obj} if not {@code null}
> +     * @throws NullPointerException if {@code obj} is {@code null}
> +     * @since 1.8
> +     */
> +    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
> +        if (obj == null)
> +            throw new NullPointerException(messageSupplier.get());
> +        return obj;
> +    }
> }
> --- old/test/java/util/Objects/BasicObjectsTest.java    2013-04-09 14:08:34.000000000 -0700
> +++ new/test/java/util/Objects/BasicObjectsTest.java    2013-04-09 14:08:34.000000000 -0700
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
>  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>  *
>  * This code is free software; you can redistribute it and/or modify it
> @@ -23,7 +23,7 @@
> 
> /*
>  * @test
> - * @bug 6797535 6889858 6891113
> + * @bug 6797535 6889858 6891113 8011800
>  * @summary Basic tests for methods in java.util.Objects
>  * @author  Joseph D. Darcy
>  */
> @@ -166,17 +166,17 @@
>         try {
>             s = Objects.requireNonNull("pants");
>             if (s != "pants") {
> -                System.err.printf("1-arg non-null failed to return its arg");
> +                System.err.printf("1-arg requireNonNull failed to return its arg");
>                 errors++;
>             }
>         } catch (NullPointerException e) {
> -            System.err.printf("1-arg nonNull threw unexpected NPE");
> +            System.err.printf("1-arg requireNonNull threw unexpected NPE");
>             errors++;
>         }
> 
>         try {
>             s = Objects.requireNonNull(null);
> -            System.err.printf("1-arg nonNull failed to throw NPE");
> +            System.err.printf("1-arg requireNonNull failed to throw NPE");
>             errors++;
>         } catch (NullPointerException e) {
>             // Expected
> @@ -186,17 +186,40 @@
>         try {
>             s = Objects.requireNonNull("pants", "trousers");
>             if (s != "pants") {
> -                System.err.printf("2-arg nonNull failed to return its arg");
> +                System.err.printf("2-arg requireNonNull failed to return its arg");
>                 errors++;
>             }
>         } catch (NullPointerException e) {
> -            System.err.printf("2-arg nonNull threw unexpected NPE");
> +            System.err.printf("2-arg requireNonNull threw unexpected NPE");
>             errors++;
>         }
> 
>         try {
>             s = Objects.requireNonNull(null, "pantaloons");
> -            System.err.printf("2-arg nonNull failed to throw NPE");
> +            System.err.printf("2-arg requireNonNull failed to throw NPE");
> +            errors++;
> +        } catch (NullPointerException e) {
> +            if (e.getMessage() != "pantaloons") {
> +                System.err.printf("2-arg requireNonNull threw NPE w/ bad detail msg");
> +                errors++;
> +            }
> +        }
> +
> +        // Test supplier rvariant
> +        try {
> +            s = Objects.requireNonNull("pants", () -> "trousers");
> +            if (s != "pants") {
> +                System.err.printf("Supplier requireNonNull failed to return its arg");
> +                errors++;
> +            }
> +        } catch (NullPointerException e) {
> +            System.err.printf("Supplier nonNull threw unexpected NPE");
> +            errors++;
> +        }
> +
> +        try {
> +            s = Objects.requireNonNull(null, () -> "pantaloons");
> +            System.err.printf("Suppiler requireNonNull failed to throw NPE");
>             errors++;
>         } catch (NullPointerException e) {
>             if (e.getMessage() != "pantaloons") {
> 




More information about the core-libs-dev mailing list