注釈
何か設定してから自分自身を返すような実装全てをBuilderパターンとします。
やりたかったこと
SimpleJdbcInsert
を使ってインサートするため、以下のようなコードが量産されていました。
new SimpleJdbcInsert(Jdbcテンプレート)
.Builderの処理
.execute(new BeanPropertySqlParameterSource(挿入するオブジェクト));
このコードでは一々SimpleJdbcInsert
やBeanPropertySqlParameterSource
をnew
する辺りが非効率で、その他の理由からもプロジェクト全体で効率化への需要があったため、関数で処理をラップすることで効率化を図ろうとしました。
問題になったこと
SimpleJdbcInsert
がBuilder
パターンで実装されているため、関数を実装する初期化済みのインスタンスを渡すぐらいしか実装が思いつきませんでした。
しかし、これでは全く効率化していないに等しいです。
全く効率化していないコード
ラップ関数(new SimpleJdbcInsert(Jdbcテンプレート).Builderの処理, 挿入するオブジェクト);
解決方法
Fluent Builderパターン(ローンパターン)的な書き方をすることで効率的に実装できました。
//ラップ関数
public int insertExecute(UnaryOperator<SimpleJdbcInsert> builder, Object entity) {
return builder.apply(new SimpleJdbcInsert(Jdbcテンプレート))
.execute(new BeanPropertySqlParameterSource(entity));
}
//利用例
insertExecute(it -> it.ビルダー処理, 挿入するオブジェクト);
「ビルダーによる生成処理が邪魔ならそれを受け取ってしまえばよい」という発想がとっさに出てこなかったのは勉強不足ですね……。