JSF2.2試してみた - 基本編のつづき
管理ビーンのデータの持ち方については、何とでもできるんだけど、個人的にはこうするのはイヤだった。
public class CalcView { private long left; private long right; private long answer; : // あとはそれらの getter/setter が続く }
イヤな理由は管理ビーンがgetter/setterだらけになること。これに尽きる。
そうは言っても、管理ビーンが画面単位で用意するなら、そこに登場するgetter/setterも、その画面(xhtml)に必要な分だけなので、もしかしたら許容範囲なのかもしれない。まかり間違って、複数の画面を束ねる管理ビーンだったりしたら、その画面分のgetter/setterがわんさと集まって、目も当てられない。
そんなわけで、データはデータであることがわかるように独立したオブジェクトにしといた。おっさん風に言えばDTO(Data Transfer Object)とかVO(Value Object)の類い。
ついで言えば、それらも
public class CalcView { private Calc calc; private List<Calc> results; }
...とかしないで、CDIからインジェクションしてもらえば良いのかな?なんても思ったんだけど、
public class CalcView { @Inject // <- これはイケる private Calc calc; @Inject // <- こっちがあやしい private List<Calc> results; }
ListみたいなコンテナオブジェクトをCDIでインジェクションする方法がイマイチわからんかった。今思えば、Producerを用意すればいいのかな?とも思うのだけれど、なんか大げさだし、気軽にCDI管理ビーンを増やしたら、CDIの名前が枯れそうなので、控えてた。
よく考えたら、インジェクションするだけなら、CalcがCDI管理ビーンである必要もないのか...とも。
CDIインジェクションで貫くとしたら、
@Named @RequestScoped public class CalcView { @Inject private Calc calc; // <- これは @RequestScoped @Inject private List<Calc> results; // <- こっちは @ViewScoped }
...ってやりたかったんだけど、@RequestScopedの管理ビーンに@ViewScopedの管理ビーンを貼り付けられなかった(...ような覚えがある。この辺、うろ覚え。
何にしてもCDI管理ビーンがgetter/setterだらけになるのは、たとえlombokがあったとしても好きじゃ無い。これは単なる好みの話。