無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

タプル

タプルを書いてみた。

import static java.util.Arrays.deepEquals;
import static java.util.Arrays.deepHashCode;

/**
 * タプル
 */
public class Tuple {

    /**
     * ペア
     *
     * @param <A> Aの型
     * @param <B> Bの型
     */
    public static class Pair<A,B> {

        private final A a;
        private final B b;

        /**
         * コンストラクタ
         * @param a a
         * @param b b
         */
        public Pair( A a, B b ) {
            this.a = a;
            this.b = b;
        }

        /**
         * aを取得する。
         * @return a
         */
        public final A getA () {
            return a;
        }
        /**
         * bを取得する。
         * @return b
         */
        public final B getB () {
            return b;
        }

        /* 継承元のクラスのJavaDocを参照 */
        @SuppressWarnings("unchecked")
        public boolean equals ( Object obj ) {
            if ( obj == null ) { return false; }
            if ( obj instanceof Pair ) {
                Object[] that = getValues((Pair<A,B>) obj);
                return deepEquals(that, getValues(this));
            }
            return false;
        }
        /* 継承元のクラスのJavaDocを参照 */
        public int hashCode () {
            return deepHashCode(getValues(this));
        }
        private static <A,B> Object[] getValues(Pair<A,B> v) {
            return new Object[] {
                v.a,v.b
            };
        }

        @Override
        public String toString() {
            return new StringBuilder().append( this.a )
                .append( "," ).append( this.b ).toString();
        }
    }

    /**
     * トリオ
     *
     * @param <A> Aの型
     * @param <B> Bの型
     * @param <C> Cの型
     */
    public static class Trio<A,B,C> extends Pair<A,B> {

        private final C c;

        /**
         * コンストラクタ
         * @param a a
         * @param b b
         * @param c c
         */
        public Trio( A a, B b, C c ) {
            super(a,b);
            this.c = c;
        }
        /**
         * cを取得する。
         * @return c
         */
        public final C getC () {
            return c;
        }

        /* 継承元のクラスのJavaDocを参照 */
        @SuppressWarnings("unchecked")
        public boolean equals ( Object obj ) {
            if ( obj == null ) { return false; }
            if ( obj instanceof Trio ) {
                Object[] that = getValues((Trio<A,B,C>) obj);
                return deepEquals(that, getValues(this))
                    && super.equals( obj );
            }
            return false;
        }
        /* 継承元のクラスのJavaDocを参照 */
        public int hashCode () {
            return deepHashCode(getValues(this))
                + super.hashCode()*37;
        }
        private static <A,B,C> Object[] getValues(Trio<A,B,C> v) {
            return new Object[] { v.c };
        }

        @Override
        public String toString() {
            return new StringBuilder().append( super.toString() )
                .append( "," ).append( this.c ).toString();
        }
    }

    /**
     * カルテット
     *
     * @param <A> Aの型
     * @param <B> Bの型
     * @param <C> Cの型
     * @param <D> Dの型
     */
    public static class Quartet<A,B,C,D> extends Trio<A,B,C> {

        private final D d;

        /**
         * コンストラクタ
         * @param a a
         * @param b b
         * @param c c
         * @param d d
         */
        public Quartet( A a, B b, C c, D d ) {
            super(a,b,c);
            this.d = d;
        }
        /**
         * dを取得する。
         * @return d
         */
        public final D getD () {
            return d;
        }

        /* 継承元のクラスのJavaDocを参照 */
        @SuppressWarnings("unchecked")
        public boolean equals ( Object obj ) {
            if ( obj == null ) { return false; }
            if ( obj instanceof Quartet ) {
                Object[] that = getValues((Quartet<A,B,C,D>) obj);
                return deepEquals(that, getValues(this))
                    && super.equals( obj );
            }
            return false;
        }
        /* 継承元のクラスのJavaDocを参照 */
        public int hashCode () {
            return deepHashCode(getValues(this))
                + super.hashCode()*37;
        }
        private static <A,B,C,D> Object[] getValues(Quartet<A,B,C,D> v) {
            return new Object[] { v.d };
        }

        @Override
        public String toString() {
            return new StringBuilder().append( super.toString() )
                .append( "," ).append( this.d ).toString();
        }
    }
}

Scalaだと「Tuple1」から「Tuple22」まで用意されているけど、まぁ4個くらいあれば事足りるかな。とりあえずは。