メソッドチェーンは便利です。
1 | new StringBuilder().append(0).append(1).append(2) |
1 | IntStream.range(0, 3).forEach(System.out::print) |
ぷよぷよの連鎖的な感じでメソッドを呼び出すものですね。
まぁ、これ自体に最終的に何か意味があるわけではないですがw
こんな風にしておくと、使うときに便利ですよね。
StringBuilderのようにメソッドをつなげてSQLを作るサンプル
タイトルの通りですが、SELECT句、FROM句、WHERE句を入れて、SQLを作ってみます。
で、このときメソッドをつなげて呼び出せるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class SqlBuilder { private StringBuilder sb = new StringBuilder(); public SqlBuilder select(String cols) { sb.append("SELECT ").append(cols); return this; } public SqlBuilder from(String tableName) { sb.append(" FROM ").append(tableName); return this; } public SqlBuilder where(String where) { sb.append(" WHERE ").append(where); return this; } public String build() { return sb.toString(); } public static void main(String[] args) { String sql = new SqlBuilder() .select("DUMMY") .from("DUAL") .where("DUMMY = 'X'") .build(); System.out.println(sql); } } |
実行結果
メソッドチェーンで組み上げたSQLが出力されます。
1 | SELECT DUMMY FROM DUAL WHERE DUMMY = 'X' |
サンプルの解説
メソッドのリターンで自分(this)のオブジェクトを返却することで、メソッドが連鎖できるようになります。
これを発展させると、よくあるビルダーパターンになります。
ビルダーパターンでは、多くの場合、本体のクラスとビルダーのクラス(今回のようなもの)が分かれています。
ビルダー側でちゃっちゃか値を詰め込んでビルドして、本体のクラスのオブジェクトを作る・・みたいな感じのものですね。
とは言え、簡単なものならこれぐらいでも十分だと思います。