Java WEBAppでCollectionの内容物を全て表示用に加工するアルゴリズムについて
Java / WebApplicationでの話です。
たとえば、DBから、下記のようなDTOコレクションを取得します。
public class Model {
private Long id;
private String data;
private Date date;
private boolean enabled;
...getter setter略...
}
以下、ビジネスロジック例とします。
List<Model> entities = modelDao.findAll();
その後、Date型やBoolean型を正規化し、view用モデルクラスに入れなおします。
public class ModelView extends Model {
private String dateView;
private String enabledView;
public ModelView(Model model) {
this.id = model.getId;
this.data = model.getData();
this.dateView = DateUtils.format(model.getDate(), "yyyy-MM-dd");
this.enabledView = model.getEnabled() ? "YES" : "NO";
}
.... getter setter略 ....
}
上記クラスを使って、
List<Model> entities = modelDao.findAll();
List<NodelView> views = new ArrayList<ModelView>();
if (entities != null || entities.size() > 0) {
for (Model model : entities) {
views.add(new ModelView(model));
}
}
return views;
というのが一番メモリ的にもパフォーマンス的にもいいのかと思いますが、
こういったケースで推奨されている実装はあるのでしょうか?
ご回答ありがとうございました。
まず、Modelクラス内に取得メソッドを、という回答についてですが、
すみません、前提条件を記載しておりませんでした。
基本的に、リクエストスコープの変数をJSPなりJSTLで出力しようとしていました。
今回の場合、以下のような形になると想定します。
<c:forEach var="o" items="views">
<c:out value="${o.dateView}" />
<c:out value="${o.enabledView}" />
</c:forEach>
この方法では、getter/setter及び、ローカル変数の定義が必要だったと思います。
ですが、このModelクラスはSpringJPAのEntity定義に基づいており、
いろいろDB関連の定義が多く含まれているので、あまり例外的な定義したくありませんでした。
また、JSTLタグlibraryのfmtなどを使う方法もあったかと思いますが、
個人的な理由ですが、HTML/JSPが好きでなかったため、サーバーサイドでリクエストスコープに置く変数そのものをVIEW用に正規化した状態で持ちたいです。
そのため、
ListからListに詰め替えるというのは非効率的だし、
それぞれのセッションが同時にこの関数を実行したときに、メモリの心配もあるなと思い、
なにかエコな実装があるかなと思った次第でした。