blob: 11b94cb3aae4526487227f8a0d20fbc6b19957c3 [file] [log] [blame]
/* Copyright (c) 2008 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.io.Serializable;
/**
* Pair is an expedient way to combine two arbitrary objects into one. <b>Its
* use is not to be preferred</b> to creating a custom type, but it can be
* handy in a pinch. If your {@link #equals}, {@link #hashCode},
* {@link #toString}, and/or {@link #clone} behavior matter to you at all, you
* may not want to use this (or you may at least wish to subclass).
*
*
*
* <p>This class may be used with the Google Web Toolkit (GWT).
*
*/
public class Pair<A,B> implements Serializable, Cloneable {
private static final long serialVersionUID = 747826592375603043L;
/** Creates a new pair containing the given objects in order. */
public static <A,B> Pair<A,B> of(A first, B second) {
return new Pair<A,B>(first, second);
}
/** The first element of the pair. */
public final A first;
/** The second element of the pair. */
public final B second;
/** Cumbersome way to create a new pair (see {@link #of}. */
public Pair(A first, B second) {
this.first = first;
this.second = second;
}
/** Optional accessor method for {@link #first}. */
public A getFirst() {
return first;
}
/** Optional accessor method for {@link #second}. */
public B getSecond() {
return second;
}
@Override public Pair<A,B> clone() {
try {
@SuppressWarnings("unchecked")
Pair<A,B> result = (Pair<A,B>) super.clone();
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError(e);
}
}
@Override public boolean equals(Object object) {
if (object instanceof Pair<?,?>) {
Pair<?,?> other = (Pair<?,?>) object;
return eq(first, other.first) && eq(second, other.second);
}
return false;
}
@Override public int hashCode() {
/*
* This combination yields entropy comparable to constituent hashes
* and ensures that hash(a,b) != hash(b,a).
*/
return (hash(first, 0) + 0xDeadBeef) ^ hash(second, 0);
}
/**
* This implementation returns the String representation of this pair in
* the form {@code (string1, string2)}, where {@code string1} and
* {@code string2} are the {@link Object#toString} representations of the
* elements inside the pair.
*/
@Override public String toString() {
return String.format("(%s, %s)", first, second);
}
private static boolean eq(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
private static int hash(Object object, int nullHash) {
return (object == null) ? nullHash : object.hashCode();
}
}