package games.strategy.util; import java.io.Serializable; import java.util.Objects; import com.google.common.base.MoreObjects; public class Tuple<T, S> implements Serializable { private static final long serialVersionUID = -5091545494950868125L; private final T first; private final S second; /** * Static creation method to create a new instance of a tuple with the parameters provided. * * <p> * This method allows for nicer tuple creation syntax, namely: * </p> * * <pre> * Tuple<String, Integer> myTuple = Tuple.of("abc", 123); * </pre> * * <p> * Instead of: * </p> * * <pre> * Tuple<String, Integer> myTuple = new Tuple<String, Integer>("abc", 123); * </pre> */ public static <T, S> Tuple<T, S> of(final T first, final S second) { return new Tuple<>(first, second); } private Tuple(final T first, final S second) { this.first = first; this.second = second; } public T getFirst() { return first; } public S getSecond() { return second; } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("first", getFirst()) .add("second", getSecond()) .toString(); } @Override public int hashCode() { return Objects.hash(first, second); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } // ignore parameterization, just perform equals-check on components final Tuple<?, ?> other = (Tuple<?, ?>) obj; return Objects.equals(getFirst(), other.getFirst()) && Objects.equals(getSecond(), other.getSecond()); } }