正方形の周長 #8

SquareParametersインスタンスへの参照を持ち、
正方形の諸元に関することはそれに委譲するようにSquarePerimeterクラスを変更する。

...snip
public class SquarePerimeter implements Runnable, ActionListener, FocusListener {
    private SquareParameters params = new SquareParameters();
    private JTextField side = new JTextField(String.valueOf(params.getSide()), 10);
    private JTextField peri = new JTextField(String.valueOf(params.getPerimeter()), 10);

...snip
        if (source == side) {
            try {
                params.setSide(Double.parseDouble(side.getText()));
                peri.setText(String.valueOf(params.getPerimeter()));
            } catch (IllegalArgumentException ex) {
                side.setText(String.valueOf(params.getSide()));
            }
        } else if (source == peri) {
            try {
                params.setPerimeter(Double.parseDouble(peri.getText()));
                side.setText(String.valueOf(params.getSide()));
            } catch (IllegalArgumentException ex) {
                peri.setText(String.valueOf(params.getPerimeter()));
            }
        }
...snip

変更はフィールドの定義および初期化と、performメソッドだけである。
SquarePerimeter自身で周の長さ等を計算するコードが消え、
必要な値は全てSquareParametersから得たり、またSquareParametersへ与えたりしている。
不正な値のチェックもSquareParametersが行ってくれるので、ほんの少しだけコードがシンプルになる。

マルチキャッチ文を使って

            } catch (NumberFormatException | IllegalArgumentException ex) {

と書こうとしたらNumberFormatExceptionはIllegalArgumentExceptionのサブクラスだったのでコンパイラに怒られた。
NumberFormatExceptionがIllegalArgumentExceptionの一種だということを気にしたことが無かったもので。
というわけで、今回の変更後もJDK6でもコンパイルできるのだった。