インタフェースって便利だね!

ついったーで軽くしたやり取りをメモ。

発端は、forの中にifを書くか、ifの中にforを書くか、どっちがいいの!?ってお話。
具体的には

boolean bool = true;

if (bool) {
    for (略) {
        〜〜
    }
} else {
    for (略) {
        〜〜
    }
}

こっちがいいのか

boolean bool = true;

for (略) {
    if (bool) {
        〜〜
    } else {
        〜〜
    }
}

こっちがいいのか。
同じ条件のforを何個も書くのも馬鹿らしいけど
ループのたびに変わらない条件判定も馬鹿らしい。

この疑問に対する一つの回答を教えてもらいました。
delegate使えばいいんじゃね。」

javaではdelegateは使えないので、
インタフェース使って、同じような仕組みを書いてみた。

まず、インタフェース。

public interface Delegate {
    public void invoke(int num);
}

で、メインクラス。

public class DelegateTestMain {

    public static void main(String[] args) {

        boolean branch = true;

        Delegate delegate = null;

        if (branch) {
            delegate = new Delegate() {
                int sum = 0;
                @Override
                public void invoke(int num) {
                    this.sum += num;
                    System.out.println(this.sum);
                }
            };
        } else {
            delegate = new Delegate() {
                int prod = 1;
                @Override
                public void invoke(int num) {
                    this.prod *= num;
                    System.out.println(this.prod);
                }
            };
        }

        for (int i = 1; i <= 10; i++) {
            delegate.invoke(i);
        }
    }
}

branchがtrueだったら、1〜10総和を一つずつ出力
falseだったら、1〜10総乗を一つずつ出力するよ。

例として適当かどうかは置いておいて
ifの条件判定も1回だし、forも1回で済んでるNE!

他にも、インタフェース使うと、メソッドを引数に渡すみたいなことができて便利ネ。

public interface Delegate<R> {
    public R invoke(String arg);
}

こんなインタフェースと

public class DelegateTestMain {

    public static void main(String[] args) {

        Delegate<List<String>> delegateList = null;
        Delegate<Map<String, String>> delegateMap = null;

        delegateList = new Delegate<List<String>>() {
            @Override
            public List<String> invoke(String arg) {
                List<String> retList = new ArrayList<String>();
                retList.add(arg);
                return retList;
            }
        };

        delegateMap = new Delegate<Map<String, String>>() {
            @Override
            public Map<String, String> invoke(String arg) {
                Map<String, String> retMap = new HashMap<String, String>();
                retMap.put(arg, arg);
                return retMap;
            }
        };

        System.out.println(getData(delegateList));
        System.out.println(getData(delegateMap));

    }

    private static <R> R getData(Delegate<R> delegate) {
        return delegate.invoke("test");
    }
}

こんなメインクラスとかで、やらせたい処理で、戻り値の型も変えられるし。