/*
* Copyright 2011 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.ipc.invalidation.external.client.types;
/**
* An immutable, semantic-free ordered pair of nullable values. These can be
* accessed using the {@link #getFirst} and {@link #getSecond} methods. Equality
* and hashing are defined in the natural way.
*
* @param <FirstType> The type of the first element
* @param <SecondType> The type of the second element
*
*/
public final class SimplePair<FirstType, SecondType> {
/**
* Creates a new pair containing the given elements in order.
*/
public static <FirstType, SecondType> SimplePair<FirstType, SecondType> of(
FirstType first, SecondType second) {
return new SimplePair<FirstType, SecondType>(first, second);
}
/**
* The first element of the pair; see also {@link #getFirst}.
*/
public final FirstType first;
/**
* The second element of the pair; see also {@link #getSecond}.
*/
public final SecondType second;
/**
* Constructor. It is usually easier to call {@link #of}.
*/
public SimplePair(FirstType first, SecondType second) {
this.first = first;
this.second = second;
}
/**
* Returns the first element of this pair; see also {@link #first}.
*/
public FirstType getFirst() {
return first;
}
/**
* Returns the second element of this pair; see also {@link #second}.
*/
public SecondType getSecond() {
return second;
}
@Override
public boolean equals(Object object) {
if (object instanceof SimplePair<?, ?>) {
SimplePair<?, ?> that = (SimplePair<?, ?>) object;
return areObjectsEqual(this.first, that.first) && areObjectsEqual(this.second, that.second);
}
return false;
}
/**
* Determines whether two possibly-null objects are equal. Returns:
*
* <ul>
* <li>{@code true} if {@code a} and {@code b} are both null.
* <li>{@code true} if {@code a} and {@code b} are both non-null and they are
* equal according to {@link Object#equals(Object)}.
* <li>{@code false} in all other situations.
* </ul>
*
* <p>This assumes that any non-null objects passed to this function conform
* to the {@code equals()} contract.
*/
private static boolean areObjectsEqual(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
@Override
public int hashCode() {
int hash1 = first == null ? 0 : first.hashCode();
int hash2 = second == null ? 0 : second.hashCode();
return 31 * hash1 + hash2;
}
/**
* {@inheritDoc}
*
* <p>This implementation returns a string in the form
* {@code (first, second)}, where {@code first} and {@code second} are the
* String representations of the first and second elements of this pair, as
* given by {@link String#valueOf(Object)}. Subclasses are free to override
* this behavior.
*/
@Override public String toString() {
return "(" + first + ", " + second + ")";
}
}