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