Skip to content

Instantly share code, notes, and snippets.

@giuniu
Created March 7, 2012 06:24
Show Gist options
  • Save giuniu/1991424 to your computer and use it in GitHub Desktop.
Save giuniu/1991424 to your computer and use it in GitHub Desktop.
tupleっぽいものをJavaで実装する
import java.lang.reflect.Field;
import java.util.Date;
public final class Tuples {
public static void main(String[] args) {
Tuple3<Integer, String, Date> tpl = Tuples.get(1, "a", new Date());
System.out.println(tpl._1);
System.out.println(tpl);
}
public static <T1> Tuple1<T1> get(T1 val1) {
return new Tuple1<T1>(val1);
}
public static <T1, T2> Tuple2<T1, T2> get(T1 val1, T2 val2) {
return new Tuple2<T1, T2>(val1, val2);
}
public static <T1, T2, T3> Tuple3<T1, T2, T3> get(T1 val1, T2 val2, T3 val3) {
return new Tuple3<T1, T2, T3>(val1, val2, val3);
}
private static abstract class AbstractTuple {
@Override public String toString() {
StringBuilder sb = new StringBuilder("(");
try {
for (Field field : getClass().getDeclaredFields())
sb.append(field.get(this).toString()).append(',');
} catch (Exception ex) {
// 原則ここには来ない
throw new RuntimeException(ex);
}
sb.setCharAt(sb.length() - 1, ')');
return sb.toString();
}
}
public static final class Tuple1<T1> extends AbstractTuple {
public final T1 _1;
Tuple1(T1 val1) {
_1 = val1;
}
}
public static final class Tuple2<T1, T2> extends AbstractTuple {
public final T1 _1;
public final T2 _2;
Tuple2(T1 val1, T2 val2) {
_1 = val1; _2 = val2;
}
}
public static final class Tuple3<T1, T2, T3> extends AbstractTuple {
public final T1 _1;
public final T2 _2;
public final T3 _3;
Tuple3(T1 val1, T2 val2, T3 val3) {
_1 = val1; _2 = val2; _3 = val3;
}
}
public static final class Tuple4<T1, T2, T3, T4> extends AbstractTuple {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
Tuple4(T1 val1, T2 val2, T3 val3, T4 val4) {
_1 = val1; _2 = val2; _3 = val3; _4 = val4;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment