「第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);
	}
}

クラスが1つになるのは嬉しいですが、いろいろひどいですw