読者です 読者をやめる 読者になる 読者になる

Wicket8 の LambdaModel

Wicket Java

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 クラス内のインナークラスにしておくと全体のコードが読みやすい気がしてきた。