001package conexp.fx.core.collections; 002 003/* 004 * #%L 005 * Concept Explorer FX 006 * %% 007 * Copyright (C) 2010 - 2023 Francesco Kriegel 008 * %% 009 * This program is free software: you can redistribute it and/or modify 010 * it under the terms of the GNU General Public License as 011 * published by the Free Software Foundation, either version 3 of the 012 * License, or (at your option) any later version. 013 * 014 * This program is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 017 * GNU General Public License for more details. 018 * 019 * You should have received a copy of the GNU General Public 020 * License along with this program. If not, see 021 * <http://www.gnu.org/licenses/gpl-3.0.html>. 022 * #L% 023 */ 024 025public class Pair<X, Y> { 026 027 public static final <X, Y> Pair<X, Y> of(final X x, final Y y) { 028 return new Pair<X, Y>(x, y); 029 } 030 031 protected X x; 032 protected Y y; 033 034 public Pair(final X x, final Y y) { 035 super(); 036 this.x = x; 037 this.y = y; 038 } 039 040 public final X x() { 041 return x; 042 } 043 044 public final Y y() { 045 return y; 046 } 047 048 public final X first() { 049 return x; 050 } 051 052 public final Y second() { 053 return y; 054 } 055 056 @Override 057 public boolean equals(final Object object) { 058 if (object == null) 059 return false; 060 if (!(object instanceof Pair)) 061 return false; 062 final Pair<?, ?> other = (Pair<?, ?>) object; 063 final boolean equalsX = 064 (other.x == null && this.x == null) || (other.x != null && this.x != null && other.x.equals(this.x)); 065 if (!equalsX) 066 return false; 067 final boolean equalsY = 068 (other.y == null && this.y == null) || (other.y != null && this.y != null && other.y.equals(this.y)); 069 return equalsY; 070 } 071 072 @Override 073 public int hashCode() { 074 if (x == null && y == null) 075 return 0; 076 if (x == null) 077 return 1 + 3 * y.hashCode(); 078 if (y == null) 079 return 1 + 2 * x.hashCode(); 080 return 1 + 2 * x.hashCode() + 3 * y.hashCode(); 081 } 082 083 @Override 084 public String toString() { 085 return "(" + x + ", " + y + ")"; 086 } 087}