Opravil jsem špatně uvedenou ukázku Tuple3.
V záznamu z jOpenSpace na téma Java vs. dynamické jazyky jsem zaznamenal postesknutí: jediné co mi v Javě chybí je možnost, aby metoda měla více návratových hodnot. Ovšem je nutné si přiznat, že to je možné již nyní. Správný název pro objekt, který je de facto kolekcí s tou vlastností, že každý prvek je jiného typu. 
Simulovat tuto funkcionalitu pomocí List<Object>, ale to není cesta správným směrem. Dále jsem našel knihovnu javatuple, ta se mi nelíbila, protože místo universálního slova tuple se třídy jmenují Tuple, Triple, ... Nakonec jsme si implementaci napsali sami, a nelitujeme.
Takže třída Tuple2 vypydá:
public class Tuple2<A, B> implements Serializable {
   protected A v1;
   protected B v2;
   private static final long serialVersionUID = -4987109478796050933L;
   public Tuple2(A v1, B v2) {
      super();
      setV1(v1);
      setV2(v2);
   }
   public A getV1() {
      return v1;
   }
   public void setV1(A v1) {
      this.v1 = v1;
   }
   public B getV2() {
      return v2;
   }
   public void setV2(B v2) {
      this.v2 = v2;
   }
   @Override
   public boolean equals(Object obj) {
      if (this == obj) return true;
      if ((obj == null) || !(obj instanceof Tuple2)) return false;
      Tuple2<?, ?> other = (Tuple2<?, ?>) obj;
      return ObjectUtils.equals(getV1(), other.getV1()) && ObjectUtils.equals(getV2(), other.getV2());
   }
   @Override
   public int hashCode() {
      int hashCode = 0;
      if (getV1() != null) hashCode += getV1().hashCode();
      hashCode *= 31;
      if (getV2() != null) hashCode += getV2().hashCode();
      return hashCode;
   }
}
Tuple3:
public class Tuple3<A, B, C> extends Tuple2<A, B> {
   protected C v3;
   private static final long serialVersionUID = -4987109478796050933L;
   public Tuple3(A v1, B v2, C v3) {
      super(v1, v2);
      setV3(v3);
   }
   public C getV3() {
      return v3;
   }
   public void setV3(C v3) {
      this.v3 = v3;
   }
   @Override
   public boolean equals(Object obj) {
      if (this == obj) return true;
      if ((obj == null) || !(obj instanceof Tuple3)) return false;
      Tuple3<?, ?, ?> other = (Tuple3<?, ?, ?>) obj;
      return super.equals(obj) && ObjectUtils.equals(getV3(), other.getV3());
   }
   @Override
   public int hashCode() {
      return super.hashCode() * 31 + ((getV3() == null) ? 0 : getV3().hashCode());
   }
}Tuple4 je již jednoduše vytvořitelný. Zbývá vytvořit implementace až kam potřebujete (my jsme se zastavili na čísle 7). Na závěr jsem vytvořil factory objekt, aby bylo vytváření pohodlnější:
public class Tuple {
   public static <A, B> Tuple2<A, B> newTuple(A a, B b) {
      return new Tuple2<A, B>(a, b);
   }
   public static <A, B, C> Tuple3<A, B, C> newTuple(A a, B b, C c) {
      return new Tuple3<A, B, C>(a, b, c);
   }
   ...
}
 
 
 
 Příspěvky
Příspěvky
 
 
