Author: niallp Date: Sun Jan 9 20:38:33 2011 New Revision: 1057022 URL: http://svn.apache.org/viewvc?rev=1057022&view=rev Log: Port LANG-667 to LANG 2.x Branch - Add a Null-safe compare() method to ObjectUtils
Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java?rev=1057022&r1=1057021&r2=1057022&view=diff ============================================================================== --- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java (original) +++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java Sun Jan 9 20:38:33 2011 @@ -287,11 +287,7 @@ public class ObjectUtils { * </ul> */ public static Object min(Comparable c1, Comparable c2) { - if (c1 != null && c2 != null) { - return c1.compareTo(c2) < 1 ? c1 : c2; - } else { - return c1 != null ? c1 : c2; - } + return (compare(c1, c2, true) <= 0 ? c1 : c2); } /** @@ -308,11 +304,45 @@ public class ObjectUtils { * </ul> */ public static Object max(Comparable c1, Comparable c2) { - if (c1 != null && c2 != null) { - return c1.compareTo(c2) >= 0 ? c1 : c2; - } else { - return c1 != null ? c1 : c2; + return (compare(c1, c2, false) >= 0 ? c1 : c2); + } + + /** + * Null safe comparison of Comparables. + * {...@code null} is assumed to be less than a no...@code null} value. + * + * @param c1 the first comparable, may be null + * @param c2 the second comparable, may be null + * @return a negative value if c1 < c2, zero if c1 = c2 + * and a positive value if c1 > c2 + * @since 2.6 + */ + public static int compare(Comparable c1, Comparable c2) { + return compare(c1, c2, false); + } + + /** + * Null safe comparison of Comparables. + * + * @param c1 the first comparable, may be null + * @param c2 the second comparable, may be null + * @param nullGreater if true <code>null</code> is considered greater + * than a Non-<code>null</code> value or if false <code>null</code> is + * considered less than a Non-<code>null</code> value + * @return a negative value if c1 < c2, zero if c1 = c2 + * and a positive value if c1 > c2 + * @see java.util.Comparator#compare(Object, Object) + * @since 2.6 + */ + public static int compare(Comparable c1, Comparable c2, boolean nullGreater) { + if (c1 == c2) { + return 0; + } else if (c1 == null) { + return (nullGreater ? 1 : -1); + } else if (c2 == null) { + return (nullGreater ? -1 : 1); } + return c1.compareTo(c2); } /** Modified: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java?rev=1057022&r1=1057021&r2=1057022&view=diff ============================================================================== --- commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java (original) +++ commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java Sun Jan 9 20:38:33 2011 @@ -210,6 +210,27 @@ public class ObjectUtilsTest extends Tes } /** + * Tests {...@link ObjectUtils#compare(Comparable, Comparable, boolean)}. + */ + public void testCompare() { + Integer one = new Integer(1); + Integer two = new Integer(2); + Integer nullValue = null; + + assertEquals("Null Null false", 0, ObjectUtils.compare(nullValue, nullValue)); + assertEquals("Null Null true", 0, ObjectUtils.compare(nullValue, nullValue, true)); + + assertEquals("Null one false", -1, ObjectUtils.compare(nullValue, one)); + assertEquals("Null one true", 1, ObjectUtils.compare(nullValue, one, true)); + + assertEquals("one Null false", 1, ObjectUtils.compare(one, nullValue)); + assertEquals("one Null true", -1, ObjectUtils.compare(one, nullValue, true)); + + assertEquals("one two false", -1, ObjectUtils.compare(one, two)); + assertEquals("one two true", -1, ObjectUtils.compare(one, two, true)); + } + + /** * Tests {...@link ObjectUtils#clone(Object)} with a cloneable object. */ public void testCloneOfCloneable() {