/* * Copyright 2013 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package java.util; import java.util.function.Supplier; /** * See <a * href="http://docs.oracle.com/javase/8/docs/api/java/util/Objects.html">the * official Java API doc</a> for details. */ public final class Objects { private Objects() { } public static <T> int compare(T a, T b, Comparator<? super T> c) { return a == b ? 0 : c.compare(a, b); } public static boolean deepEquals(Object a, Object b) { if (a == b) { return true; } if (a == null || b == null) { return false; } // Use object equality check if any of these objects is not an array. Class<?> class1 = a.getClass(); Class<?> class2 = b.getClass(); if (!class1.isArray() || !class2.isArray()) { return a.equals(b); } // Use object array equality check if these objects are object arrays; // if one of these objects is an object array and the other is not, just return false. boolean isObjectArray1 = a instanceof Object[]; boolean isObjectArray2 = b instanceof Object[]; if (isObjectArray1 || isObjectArray2) { return isObjectArray1 && isObjectArray2 && Arrays.deepEquals((Object[]) a, (Object[]) b); } // At this point a and b are primitive arrays so we just check that they have same types. if (!class1.equals(class2)) { return false; } if (a instanceof boolean[]) { return Arrays.equals((boolean[]) a, (boolean[]) b); } if (a instanceof byte[]) { return Arrays.equals((byte[]) a, (byte[]) b); } if (a instanceof char[]) { return Arrays.equals((char[]) a, (char[]) b); } if (a instanceof short[]) { return Arrays.equals((short[]) a, (short[]) b); } if (a instanceof int[]) { return Arrays.equals((int[]) a, (int[]) b); } if (a instanceof long[]) { return Arrays.equals((long[]) a, (long[]) b); } if (a instanceof float[]) { return Arrays.equals((float[]) a, (float[]) b); } // could only be double[] return Arrays.equals((double[]) a, (double[]) b); } public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } @SuppressWarnings("StringEquality") public static boolean equals(String a, String b) { return a == b; } public static int hashCode(Object o) { return o != null ? o.hashCode() : 0; } public static int hash(Object... values) { return Arrays.hashCode(values); } public static boolean isNull(Object obj) { return obj == null; } public static boolean nonNull(Object obj) { return obj != null; } public static <T> T requireNonNull(T obj) { if (obj == null) { throw new NullPointerException(); } return obj; } public static <T> T requireNonNull(T obj, String message) { if (obj == null) { throw new NullPointerException(message); } return obj; } public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) { if (obj == null) { throw new NullPointerException(messageSupplier.get()); } return obj; } public static String toString(Object o) { return String.valueOf(o); } public static String toString(Object o, String nullDefault) { return o != null ? o.toString() : nullDefault; } }