Java8でDBFlute!? from ビズリーチブログ

昨年、DBFluteの勉強会(in 表参道)を
支援してくださった株式会社ビズリーチ様の
エンジニアブログが再開されました!

ビズリーチラボ

多種多様なエンジニアが集まっているので、
内容もバラバラでマニアックでとても楽しみです。

さて、そこで紹介されていたびっくり記事。
(jfluteが読んでて「おおっ」ってうなった)

// Java8を試してみた | ビズリーチラボ
http://lab.bizreach.co.jp/?p=233

なんと、Java8の "lamda式" (ラムダ式)
(クロージャー...っていう感じではないのかな!?)

を DBFlute で試されています。

わー、待ち望んでいた構文がとうとう!

DBFluteはコールバックをめっちゃ多用しています。
Javaのコールバックがどんくさいのは承知の上で。
それでもやっぱりその方がAPI的にはしっくりくるから。

ExistsReferrerやLoadReferrerで採用されています。
要は、こんな感じ:
cb.query().existsPurchaseList(new SubQuery<PurchaseCB>() {
    public void query(PurchaseCB subCB) {
        // 2000円以上の購入をしたことのある会員
        subCB.query().setPurchasePrice_GreaterEqual(2000);
    }
});
「public void どけっ!
 つーか、括弧閉じがなんか多いわー」

って、言いたくなりますよね。
(jfluteは、言い続けてきた)

ブログを読むと、どうやらこんな感じになるようで:
cb.query().existsPurchaseList(subCB -> {
    // 2000円以上の購入をしたことのある会員
    subCB.query().setPurchasePrice_GreaterEqual(2000);
});
ああぁ、素敵。
というか、ようやく C# に追いついた!

コールバックは、内部的な処理でもよく使っています。
やはり、構造を作りやすいんですよね。
クラス化して Template Method パターンとかでも
いいのですが、そこまで大げさでなくていい処理に、
スーパークラスで継承してってのは重くって、
それはそれで大げさにする必要のある場所で使って、
フットワークの軽さが欲しいところではコールバック。
(そんな厳密ではないですけどね...なんとなくって感じ)

まあ、コールバックってちょっと敷居はあがるんですが、
少なくともConditionBeanの場合は、
「とある処理をコールバックさせる」って意識じゃなく、
「DBアクセスの条件を指定する」って感じなので、
プログラミング経験浅い人にも、
わりとさっくり受け入れてもらっています。

だからこそというかなんというか、とにかくとにかく、
Javaプログラマーとしてうれしいことうれしいこと。

ただ、Eclipseの補完がそこにどれだけいい感じの
支援をしてくれるかどうか、そこは大事。
そう、今までJavaのコールバックがどんくさいっても、
Eclipseの補完が素敵すぎてそれをあまり感じさせなかった。
一方で、C#delegateですっかりだけど、VisualStudioの
補完が残念で、少ない文字数なのに逆に書くのが面倒とかね。

また、Java8はリリースまだだし、
リリースされてからJava8が現場に降りてくるのはまだまだ先。
というか、Java7ですら現場デビューはあまり見かけません。
身近なプロジェクトのほとんどがまだJava6です。

ただまあ、Java7にする意味があまりないってこともあるかも。
Java8はかなりインパクトがあるとなれば、
早めに現場も Java8 を使おうってことになるかも。
そうなるといいなぁと妄想だけしています。
こんな記事も見かけますし...
 -> Spring Framework 4.0はJava 8対応

フレームワーク側はみな似たようなこと考えているのかな。
Java8対応じゃなくてもJava8で動くってのが一番ですが、
明示的な対応の方がいいことがあるってなら覚悟しないとぅ。

個人的には、Java8が、
DBFluteのさらなる旅へのスタート地点だと...