インタフェースって便利だね!
ついったーで軽くしたやり取りをメモ。
発端は、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"); } }
こんなメインクラスとかで、やらせたい処理で、戻り値の型も変えられるし。