「第3回 オフラインリアルタイムどう書く」参考問題: へなちょこ解答(Java・リフレクション編)
1つ前の記事(http://d.hatena.ne.jp/torazuka/20120818/yhpg)の続きです。
Groovyの解答例を見て吹きました。
リフレクションにシンタックスシュガーを用意するとは、さすがGroovyですね(@_@;)
Javaで同じことをするとこうなりますか。イヤハヤ……。
import java.lang.reflect.Method; /** * 問題: http://qiita.com/items/ebd8a56b41711ba459f9 (Groovy解答例の真似事編) */ public class BallCountRef { int out; int strike; int ball; public String toPlayString() { return String.valueOf(out) + String.valueOf(strike) + String.valueOf(ball); } public void s() { strike++; if (2 < strike) { out++; strike = 0; ball = 0; } check(); } public void b() { ball++; if (3 < ball) { strike = 0; ball = 0; } } public void f() { if (strike < 2) { strike++; } } public void h() { strike = 0; ball = 0; } public void p() { strike = 0; ball = 0; out++; check(); } // スリーアウトのチェック public void check() { if (out == 3) { out = 0; strike = 0; ball = 0; } } protected String execute(String input) { out = strike = ball = 0; String[] tmp = new String[input.length()]; for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); Method method; try { method = this.getClass().getMethod(String.valueOf(c), null); method.invoke(this, null); } catch (Exception e) { e.printStackTrace(); } tmp[i] = toPlayString(); } StringBuilder result = new StringBuilder(); result.append(tmp[0]); for (int i = 1; i < input.length(); i++) { result.append(','); result.append(tmp[i]); } return new String(result); } }
- 上のコードとテストコード https://gist.github.com/3383881
クラスが1つになるのは嬉しいですが、いろいろひどいですw