1 /* Copyright (c) 2008 Sascha Kohlmann
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU Affero General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Affero General Public License for more details.
12 *
13 * You should have received a copy of the GNU Affero General Public License
14 */
15 package net.sf.eos.util;
16
17 import net.sf.eos.Nullable;
18
19
20 /**
21 * A class to store a pair of generic types. Use with care as keys in {@code maps}.
22 *
23 * @param <F> the type of the first value
24 * @param <S> the type of the second value
25 *
26 * @since 0.1.0
27 * @author Sascha Kohlmann
28 */
29 public final class Pair<F, S> {
30
31 /** The first value of the pair. */
32 private final F first;
33
34 /** The second value of the pair. */
35 private final S second;
36
37 /**
38 * Creates a new pair.
39 * @param first the first value of this pair
40 * @param second the second value of this pair
41 *
42 */
43 public Pair(@SuppressWarnings("hiding") @Nullable final F first,
44 @SuppressWarnings("hiding") @Nullable final S second) {
45 this.first = first;
46 this.second = second;
47 }
48
49 /**
50 * Returns the first value of the pair.
51 * @return the first value of the pair
52 */
53 public F getFirst() {
54 return this.first;
55 }
56
57 /**
58 * Returns the second value of the pair.
59 * @return the second value of the pair
60 */
61 public S getSecond() {
62 return this.second;
63 }
64
65 /** {@inheritDoc} */
66 @Override
67 public int hashCode() {
68 int hash = EqualsAndHashUtil.hash(this.first);
69 return hash * EqualsAndHashUtil.hash(this.second);
70 }
71
72 /** {@inheritDoc} */
73 @Override
74 public boolean equals(@Nullable final Object other) {
75 if (this == other) {
76 return true;
77 }
78
79 if (other == null) {
80 return false;
81 }
82
83 if (!(this.getClass().equals(other.getClass()))) {
84 return false;
85 }
86
87 final Pair<? super F, ? extends F> pair = (Pair<? super F, ? extends F>) other;
88 return (EqualsAndHashUtil.isEqual(this.first, pair.first)
89 && EqualsAndHashUtil.isEqual(this.second, pair.second));
90 }
91 }