Skip to content

Instantly share code, notes, and snippets.

@danielgallegovico
Created March 6, 2017 10:04
Show Gist options
  • Save danielgallegovico/986b82c6d66135ec4baa37b7030e0935 to your computer and use it in GitHub Desktop.
Save danielgallegovico/986b82c6d66135ec4baa37b7030e0935 to your computer and use it in GitHub Desktop.
/*
* Copyright (C) 2017 Daniel Gallego Vico.
*
* 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.
*/
import java.util.Objects;
/**
* Container to ease passing around a tuple of two objects.
* This object provides a sensible implementation of equals(),
* returning true if equals() is true on each of the contained objects.
*
* @param <F> First object type to store in the {@link Pair}
* @param <S> Second object type to store in the {@link Pair}
*/
public class Pair<F, S> {
public final F first;
public final S second;
/**
* Constructor.
*
* @param first The first object in the {@link Pair}
* @param second The second object in the {@link Pair}
*/
public Pair(F first, S second) {
this.first = first;
this.second = second;
}
/**
* Checks the two {@link Pair} objects for equality by delegating to their respective
* {@link Object#equals(Object)} methods.
*
* @param o The {@link Pair} to which this one is to be checked for equality
* @return true if the underlying objects of the {@link Pair} are considered equal
*/
@Override
public boolean equals(Object o) {
if(!(o instanceof Pair)) {
return false;
}
Pair<?,?> p = (Pair<?,?>) o;
return Objects.equals(p.first, first)
&& Objects.equals(p.second, second);
}
/**
* Compute a hash code using the hash codes of the underlying objects.
*
* @return a hashcode on the {@link Pair}
*/
@Override
public int hashCode() {
return (first == null ? 0 : first.hashCode())
^ (second == null ? 0 : second.hashCode());
}
/**
* Convenience method for creating an appropriately typed {@link Pair}.
*
* @param a The first object in the {@link Pair}
* @param b The second object in the {@link Pair}
* @param <A> First object type of the {@link Pair}
* @param <B> Second object type of the {@link Pair}
*
* @return a {@link Pair} that is templatized with the types of a and b
*/
public static <A, B> Pair<A, B> create(A a, B b) {
return new Pair<>(a, b);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment