正方形の周長 #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でもコンパイルできるのだった。