blob: 58c0c72e069865de57e63b05171d38a0fdf1d4da [file] [log] [blame]
/*
* 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;
}
}