Wicket 8 になると待望のラムダ Model がある。
PropertyModel を使って TextField に 自Pageクラスの変数を指定すると、どうしても
new TextField<>("idname", new PropertyModel<>(this, "name"));
のように書くことになり、"name" 変数名がタイプセーフでなくバグの温床になる。
IModel<T> LambdaModel.of(SerializableSupplier<T> getter, SerializableConsumer<T> setter)
LambdaModel.of で、getter に Supplierと setter として Consumer シリアライズ化されてるものを指定して作る。
自Pageクラスに getter , setter を書くなら、
new TextField<>("name", LambdaModel.of(this::getName, this::setName));
と書けるが、入力項目が多いとそれだけ getter , setter を自Pageクラスに設置することになる。
入力項目だけを束ねたクラスを宣言して→ Fields そこでgetter , setterを用意して、
final Fields fields = new Fields(); final TextField<String> nameField = new TextField<>("name", LambdaModel.of(fields::getName, fields::setName) ); queue(nameField); queue(new Form<Void>("form"){ @Override protected void onSubmit(){ /* fields.getName() の結果とnameField.getModelObject() は同じ。 */ } });
ということはできるけど、
Page クラス内で入力項目を定義するのがいいのか?
束ねたクラスを用意して外に置くか?
束ねたクラスを用意してPage クラス内のインナークラスにしておくのが良いのか?
迷う。。。
束ねたクラスを用意してPage クラス内のインナークラスにしておくと全体のコードが読みやすい気がしてきた。