All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.common.base.Objects Maven / Gradle / Ivy

Go to download

Google Collections Library is a suite of new collections and collection-related goodness for Java 5.0

The newest version!
/*
 * Copyright (C) 2007 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 com.google.common.base;

import java.util.Arrays;

/**
 * Helper functions for operating on {@code Object}s.
 *
 * @author Laurence Gonsalves
 */
public final class Objects {
  private Objects() {}

  /**
   * Gets hash code of an object, optionally returns hash code based on the
   * "deep contents" of array if the object is an array.
   * 

* If {@code o} is null, 0 is returned; if {@code o} is an array, the * corresponding {@link Arrays#deepHashCode(Object[])}, or * {@link Arrays#hashCode(int[])} or the like is used to calculate the hash * code. */ public static int deepHashCode(@Nullable Object o) { if (o == null) { return 0; } if (!o.getClass().isArray()) { return o.hashCode(); } if (o instanceof Object[]) { return Arrays.deepHashCode((Object[]) o); } if (o instanceof boolean[]) { return Arrays.hashCode((boolean[]) o); } if (o instanceof char[]) { return Arrays.hashCode((char[]) o); } if (o instanceof byte[]) { return Arrays.hashCode((byte[]) o); } if (o instanceof short[]) { return Arrays.hashCode((short[]) o); } if (o instanceof int[]) { return Arrays.hashCode((int[]) o); } if (o instanceof long[]) { return Arrays.hashCode((long[]) o); } if (o instanceof float[]) { return Arrays.hashCode((float[]) o); } if (o instanceof double[]) { return Arrays.hashCode((double[]) o); } throw new AssertionError(); } /** * Gets string representation of an object, or the "deep content" of the array * if the {@code o} is an array. *

* If {@code o} is null, {@code "null"} is returned; if {@code o} is an * array, the corresponding {@link Arrays#deepToString(Object[])}, * {@link Arrays#toString(int[])} or the like is used to get the string. */ public static String deepToString(@Nullable Object o) { if (o == null) { return String.valueOf(o); } if (!o.getClass().isArray()) { return o.toString(); } if (o instanceof Object[]) { return Arrays.deepToString((Object[]) o); } if (o instanceof boolean[]) { return Arrays.toString((boolean[]) o); } if (o instanceof char[]) { return Arrays.toString((char[]) o); } if (o instanceof byte[]) { return Arrays.toString((byte[]) o); } if (o instanceof short[]) { return Arrays.toString((short[]) o); } if (o instanceof int[]) { return Arrays.toString((int[]) o); } if (o instanceof long[]) { return Arrays.toString((long[]) o); } if (o instanceof float[]) { return Arrays.toString((float[]) o); } if (o instanceof double[]) { return Arrays.toString((double[]) o); } throw new AssertionError(); } /** * Determines if two objects are equal as determined by * {@link Object#equals(Object)}, or "deeply equal" if both are arrays. *

* If both objects are null, true is returned; if both objects are array, the * corresponding {@link Arrays#deepEquals(Object[], Object[])}, or * {@link Arrays#equals(int[], int[])} or the like are called to determine * equality. *

* Note that this method does not "deeply" compare the fields of the * objects. */ public static boolean deepEquals( @Nullable Object o1, @Nullable Object o2) { if (o1 == o2) { return true; } if (o1 == null || o2 == null) { return false; } Class type1 = o1.getClass(); Class type2 = o2.getClass(); if (!(type1.isArray() && type2.isArray())) { return o1.equals(o2); } if (o1 instanceof Object[] && o2 instanceof Object[]) { return Arrays.deepEquals((Object[]) o1, (Object[]) o2); } if (type1 != type2) { return false; } if (o1 instanceof boolean[]) { return Arrays.equals((boolean[]) o1, (boolean[]) o2); } if (o1 instanceof char[]) { return Arrays.equals((char[]) o1, (char[]) o2); } if (o1 instanceof byte[]) { return Arrays.equals((byte[]) o1, (byte[]) o2); } if (o1 instanceof short[]) { return Arrays.equals((short[]) o1, (short[]) o2); } if (o1 instanceof int[]) { return Arrays.equals((int[]) o1, (int[]) o2); } if (o1 instanceof long[]) { return Arrays.equals((long[]) o1, (long[]) o2); } if (o1 instanceof float[]) { return Arrays.equals((float[]) o1, (float[]) o2); } if (o1 instanceof double[]) { return Arrays.equals((double[]) o1, (double[]) o2); } throw new AssertionError(); } /** * Determines whether two possibly-null objects are equal. Returns: * *

    *
  • {@code true} if {@code a} and {@code b} are both null. *
  • {@code true} if {@code a} and {@code b} are both non-null and they are * equal according to {@link Object#equals(Object)}. *
  • {@code false} in all other situations. *
* *

This assumes that any non-null objects passed to this function conform * to the {@code equals()} contract. */ public static boolean equal(@Nullable Object a, @Nullable Object b) { return a == b || (a != null && a.equals(b)); } /** * Generates a hashcode for multiple values. The hash code is generated by * calling {@link Arrays#hashCode(Object[])}. * *

This is useful for implementing {@link Object#hashCode()}. For example, * in an object that has three properties, {@code x}, {@code y}, and * {@code z}, one could write: *

   * public int hashCode() {
   *   return Objects.hashCode(getX(), getY(), getZ());
   * }
* * Warning: When a single object is supplied, the returned hash code * does not equal the hash code of that object. */ public static int hashCode(Object... objects) { return Arrays.hashCode(objects); } /** * Checks that the specified object is not {@code null}. * * @param o the object to check for nullness. * @return {@code o} if not null. * @throws NullPointerException if {@code o} is null. */ public static T nonNull(T o) { if (o == null) { throw new NullPointerException(); } return o; } /** * Checks that the specified object is not {@code null}. * * @param o the object to check for nullness. * @param message exception message used in the event that a {@code * NullPointerException} is thrown. * @return {@code o} if not null. * @throws NullPointerException if {@code o} is null. */ public static T nonNull(T o, String message) { if (o == null) { throw new NullPointerException(message); } return o; } /** * Returns the first of the given parameters that is not {@code null} if any, * or otherwise throws {@link NullPointerException}. * * @return {@code first} if {@code first} is not {@code null}, or * {@code second} if {@code first} is {@code null} and {@code second} is * not {@code null}. * @throws NullPointerException if both {@code first} and {@code second} were * {@code null}. */ public static T firstNonNull(@Nullable T first, @Nullable T second) { return first != null ? first : nonNull(second); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy