6889858: Add nonNull methods to java.util.Objects
authordarcy
Mon, 19 Oct 2009 16:31:48 -0700
changeset 4061 35a627ad2443
parent 4060 3d03789e9478
child 4062 203caeb1e9a8
child 4114 70dcca39287d
child 4150 74dfe4a968c6
child 4157 558590fb3b49
child 4214 0fa32d38146b
6889858: Add nonNull methods to java.util.Objects Reviewed-by: darcy Contributed-by: jjb@google.com
jdk/src/share/classes/java/util/Objects.java
jdk/test/java/util/Objects/BasicObjectsTest.java
--- a/jdk/src/share/classes/java/util/Objects.java	Mon Oct 19 13:43:25 2009 -0700
+++ b/jdk/src/share/classes/java/util/Objects.java	Mon Oct 19 16:31:48 2009 -0700
@@ -107,4 +107,50 @@
     public static <T> int compare(T a, T b, Comparator<? super T> c) {
         return (a == b) ? 0 :  c.compare(a, b);
     }
+
+    /**
+     * Checks that the specified object reference is not {@code null}. This
+     * method is designed primarily for doing parameter validation in methods
+     * and constructors, as demonstrated below:
+     * <blockquote><pre>
+     * public Foo(Bar bar) {
+     *     this.bar = Objects.nonNull(bar);
+     * }
+     * </pre></blockquote>
+     *
+     * @param obj the object reference to check for nullity
+     * @param <T> the type of the reference
+     * @return {@code obj} if not {@code null}
+     * @throws NullPointerException if {@code obj} is {@code null}
+     */
+    public static <T> T nonNull(T obj) {
+        if (obj == null)
+            throw new NullPointerException();
+        return obj;
+    }
+
+    /**
+     * Checks that the specified object reference is not {@code null} and
+     * throws a customized {@link NullPointerException} if it is. This method
+     * is designed primarily for doing parameter validation in methods and
+     * constructors with multiple parameters, as demonstrated below:
+     * <blockquote><pre>
+     * public Foo(Bar bar, Baz baz) {
+     *     this.bar = Objects.nonNull(bar, "bar must not be null");
+     *     this.baz = Objects.nonNull(baz, "baz must not be null");
+     * }
+     * </pre></blockquote>
+     *
+     * @param obj     the object reference to check for nullity
+     * @param message 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}
+     */
+    public static <T> T nonNull(T obj, String message) {
+        if (obj == null)
+            throw new NullPointerException(message);
+        return obj;
+    }
 }
--- a/jdk/test/java/util/Objects/BasicObjectsTest.java	Mon Oct 19 13:43:25 2009 -0700
+++ b/jdk/test/java/util/Objects/BasicObjectsTest.java	Mon Oct 19 16:31:48 2009 -0700
@@ -37,6 +37,7 @@
         errors += testHashCode();
         errors += testToString();
         errors += testCompare();
+        errors += testNonNull();
         if (errors > 0 )
             throw new RuntimeException();
     }
@@ -102,4 +103,53 @@
         }
         return errors;
     }
+
+    private static int testNonNull() {
+        int errors = 0;
+        String s;
+
+        // Test 1-arg variant
+        try {
+            s = Objects.nonNull("pants");
+            if (s != "pants") {
+                System.err.printf("1-arg non-null failed to return its arg");
+                errors++;
+            }
+        } catch (NullPointerException e) {
+            System.err.printf("1-arg nonNull threw unexpected NPE");
+            errors++;
+        }
+
+        try {
+            s = Objects.nonNull(null);
+            System.err.printf("1-arg nonNull failed to throw NPE");
+            errors++;
+        } catch (NullPointerException e) {
+            // Expected
+        }
+
+        // Test 2-arg variant
+        try {
+            s = Objects.nonNull("pants", "trousers");
+            if (s != "pants") {
+                System.err.printf("2-arg nonNull failed to return its arg");
+                errors++;
+            }
+        } catch (NullPointerException e) {
+            System.err.printf("2-arg nonNull threw unexpected NPE");
+            errors++;
+        }
+
+        try {
+            s = Objects.nonNull(null, "pantaloons");
+            System.err.printf("2-arg nonNull failed to throw NPE");
+            errors++;
+        } catch (NullPointerException e) {
+            if (e.getMessage() != "pantaloons") {
+                System.err.printf("2-arg nonNull threw NPE w/ bad detail msg");
+                errors++;
+            }
+        }
+        return errors;
+    }
 }